2012-02-08 135 views
1

我有一個簡單的.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()會更安全。

感謝那些幫助過,非常感謝!

+0

是否有某種格式屬性,您可以設置/調用 – MethodMan 2012-02-08 21:33:38

+2

這些空間應該是不相關的。你有導入它的實際問題嗎?如果是這樣,請發佈該部分的詳細信息,並附上完整的錯誤消息等。 – 2012-02-08 21:35:58

+0

@Robert,「invalid xml」表示不符合XML規範的文本(在這種情況下不是這樣),到目前爲止您的問題是「我不喜歡格式化有效的XML「 - 需要更多的細節。 – 2012-02-08 21:39:00

回答

4

我認爲格式化是微不足道的。 xml解析器會將文檔解析爲xml,無論它們之間是否有空格。調用一個函數,獲取一個xml,並且xml讀取器處理xml。也許文件本身有空間。

+2

+1,XML格式和空白不重要。 – kprobst 2012-02-08 21:36:39