我有一個簡單的.NET Web服務應該返回一個字符串值。它創建了一個數據集,並返回的getXML()方法,像這樣:.NET Web服務返回無效的XML
[WebMethod]
public string GetOpenIssues(string CustomerCode, string LocationShortName)
{
DAL.EncodedConnectionString = ConfigurationManager.ConnectionStrings["EncodedConnectionString"].ConnectionString;
System.Data.SqlClient.SqlCommand sc = new System.Data.SqlClient.SqlCommand("GetOpenIssues");
sc.Parameters.AddWithValue("CustomerCode", CustomerCode);
sc.Parameters.AddWithValue("LocationShortName", LocationShortName);
return DAL.SPDataSet(sc, "OpenIssues").GetXml();
}
問題是,當我把這個Web服務無論從另一程序或在調試模式下運行它,並查看結果,它給我的以下內容:
<?xml version="1.0" encoding="utf-8" ?>
<string xmlns="RemoteWebService"><OpenIssues> <Table> <IssueID>15351</IssueID> <IssueSummary>Computer keeps crashing. This continues to be a problem</IssueSummary> <LocationName>West Side</LocationName> <Status>WIP</Status> <CustomerID>89755</CustomerID> <CustomerName>West Side Computers</CustomerName> <CustomerShortName>WSC</CustomerShortName> <Notes /> <STATUS1>Work In Progress</STATUS1> <SubmittedBy>WSC - Tom Johns</SubmittedBy> <EQ_Replaced>true</EQ_Replaced></Table> </OpenIssues></string>
其中,如您所知,格式不正確。出於某種原因,它在每個元素之間放置空格。
任何想法,我做錯了什麼?我想要做的就是返回這個結果的xml,這樣我就可以在沒有用.NET編寫的其他內部應用程序中使用它。
UPDATE 感謝您的答覆,但我相信格式化是一個問題,這就是爲什麼。我正在寫一個使用此Web服務的Android應用程序。我可以連接並檢索xml字符串,但是當我嘗試解析它時,由於字符串中有額外的空間,它會錯過節點。要更確認這一點,如果我直接從Web服務URL複製並粘貼輸出到一個空文件中,請將其保存爲.xml並嘗試查看它,但無法打開。此外,當我嘗試右鍵單擊Web服務輸出頁面以查看源代碼時,它表示目前無法查看它。但是,當我使用格式正確的xml字符串時,我可以在瀏覽器中查看它並查看源代碼。
不太確定這裏還有什麼要說的......我們在Android/Java這方面做了很多故障排除,這裏是StackOverflow Android Question,當我們使用XML格式如上(意思是帶有額外的空格在其中),解析器不會選取IssueSummary元素。但是,如果手動刪除空格並將應用程序指向新文件(而不是Web服務),則會找到IssueSummary元素並顯示數據正常。這不會導致你相信它與節點之間的空間有關嗎?
更新#2 - 分辨率
挖掘和挖掘我能找出一個解決之後。我們的web方法使用.GetXml(),它在每個節點之間返回上面的Xml。我的同事和我試過幾件事情與Web服務和想通了,如果我們用一個XmlDocument並調用InnerXml屬性來代替,它返回的XML沒有那些空格:
[WebMethod]
public string GetOpenIssues(string CustomerCode, string LocationShortName)
{
DAL.EncodedConnectionString = ConfigurationManager.ConnectionStrings["EncodedConnectionString"].ConnectionString;
System.Data.SqlClient.SqlCommand sc = new System.Data.SqlClient.SqlCommand("GetOpenIssuesSite");
sc.Parameters.AddWithValue("CustomerCode", CustomerCode);
sc.Parameters.AddWithValue("ICAO", LocationShortName);
System.Data.DataSet ds = DAL.SPDataSet(sc, "OpenIssues");
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
System.IO.StringWriter sw = new System.IO.StringWriter();
ds.WriteXml(sw);
doc.LoadXml(sw.ToString());
return doc.InnerXml;
}
一旦我們這樣做,對解析器另一端(Android應用程序)完美地處理它。因此,使用XmlDocument的.InnerXml而不是DataSet的.GetXml()會更安全。
感謝那些幫助過,非常感謝!
是否有某種格式屬性,您可以設置/調用 – MethodMan 2012-02-08 21:33:38
這些空間應該是不相關的。你有導入它的實際問題嗎?如果是這樣,請發佈該部分的詳細信息,並附上完整的錯誤消息等。 – 2012-02-08 21:35:58
@Robert,「invalid xml」表示不符合XML規範的文本(在這種情況下不是這樣),到目前爲止您的問題是「我不喜歡格式化有效的XML「 - 需要更多的細節。 – 2012-02-08 21:39:00