2013-03-12 52 views
1

我正在使用通過SOAP從Web服務下載XML文件的C#客戶端。對於服務上託管的一些較舊的記錄,XML顯然會在其中的某處埋入一個0x​​14,這會引發「無效的空白字符」異常。我使用Linq將XML轉儲到文件中。有什麼方法可以指示Linq處理無效字符而不會丟失其餘的XML?如何使用Linq處理/清除XML中的無效0x14?

編輯:

下面的代碼我現在有用於把XML到文件:

XDocument c = 
      new XDocument(
       new XElement(nameSpace + "getCitationsResponse", 
        new XAttribute(XNamespace.Xmlns + "ns1", nameSpace), 
        new XElement("list", 
         record.reportDateSpecified ? new XElement("reportDate", record.reportDate) : null, 
         new XElement("reportType", record.reportType), 
         new XElement("title", record.title), 
         new XElement("projectNumber", record.projectNumber), 
         new XElement("author", record.author), 
         new XElement("abstract", [email protected]), 
         new XElement("numPages", record.numPages), 
         record.isDataTypeSpecified ? new XElement("isDataType", record.isRestrictedData) : null, 
         new XElement("comments", record.comments), 
         new XElement("attachments", from a in record.attachments 
                select new XElement("list", 
                 new XElement("id", a.id), 
                 new XElement("filePath", a.filePath), 
                 new XElement("type", a.type))))); 

我不得不砍了一些它的通常的原因,但我刪除是相同的這裏顯示的是什麼。

我在發佈之前使用了SoapUI,看看我是否能夠找出這個缺陷的位置,但我沒有參見 SoapUI中的任何東西,並且它本身不會生成錯誤。

編輯#2:

下面是確切的錯誤消息和堆棧跟蹤。讓我想知道我是否真的可以做些什麼或者我只需要在某些事情上工作來記錄哪些記錄具有無效字符,並嘗試用SoapUI手動拉下他們。

Invalid white space character (0x14) in text to output 
    at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall) 
    at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) 
    at Downloader.WebService.ApiService.getRecords(String username, String[] ids) 
    at Downloader.Central.RecordLoop(ApiService svc, Int32 offset, String username) 

getRecords是由WSDL生成的API調用,並對RecordLoop是一個遞歸函數,我寫來處理通過API調用迭代找到更新的記錄,並將其推到LINQ的功能我張貼了。

+0

您能爲我們提供一些樣本數據嗎? – MarcinJuraszek 2013-03-12 18:50:30

+0

你可以在這裏看看這個解決方案:http://seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/ – Holger 2013-03-12 18:51:25

+1

如果它帶有無效字節,那麼嚴格說它實際上不是XML ...只是說... – 2013-03-12 18:58:06

回答

0

正如在上面的一些評論中提到的那樣,可以執行不同的忍者技巧來獲得SOAP響應以符合XML規範。

如果您選擇更改響應以使其成爲有效的XML,則必須認真考慮您的更改是否正在改變響應的含義。

正如我所看到的,問題不在您身邊,而是在服務方面。如果可以,您應該嘗試讓服務所有者升級服務,以便在其Web服務中提供正確格式的XML。

當與第三方Web服務打交道時,我通常做到以下幾點:

  • 啓用任何請求和響應,並從第三網絡服務完整的XML模式驗證。如果請求或響應不是XML模式有效的,那麼我們(客戶和服務)有一個問題,可能是小問題或重要問題 - 但至少它是被關注的。

  • 在嘗試修復內容之前,始終記錄任何架構驗證錯誤,以確保它是有記錄的。

  • 確保我完全瞭解修改內容的系統,業務或法律影響。

  • 確保我使用正確的編碼格式(UTF8,Latin1或其他)編碼響應。

無效的內容通常是xml文本元素,其中包含非法的XML字符。在傳輸這種文本節點時,服務端應該使用XML編碼或base64編碼,以保留格式和內容。

關於實際更改內容的技術性部分,以便它變得有效,我通常會添加WCF行爲,這樣可以解決問題,這樣做會分離修復xml的問題和業務目的服務調用。

如果或者當服務被更新以在任何請求時提供有效的XML,那麼也很容易刪除WCF行爲。