2010-07-27 135 views
1

我正在使用c#與具有公開REST API的數據庫進行交互。我感興趣的表格包含論壇帖子,其中一些本身包含xml。如何使用c#xmlreader處理包含嵌套xml的xml?

每當我的結果集包含具有XML後,我的應用程序如下拋出一個錯誤:

異常詳細信息:System.Xml.XmlException:「>」是一個意外標記。預期令牌是 '「' 或 '''行1,位置62

這是失敗的行:

線44:ds.ReadXml(XMLDATA);

這是我使用的代碼:

 var webClient = new WebClient(); 

     string searchString = searchValue.Text; 

     string requestUrl = "http://myserver/restapi.ashx/search.xml?pagesize=4&pageindex=0&query="; 
     requestUrl += searchString; 

     XmlReaderSettings settings = new XmlReaderSettings(); 
     settings.ProhibitDtd = false; 


     XmlReader xmlData = XmlReader.Create(webClient.OpenRead(requestUrl),settings); 

     DataSet ds = new DataSet(); 
     ds.ReadXml(xmlData); 
     Repeater1.DataSource = ds.Tables[1]; 
     Repeater1.DataBind(); 

這是XML的記錄,它的窒息(在節點中的東西引起的問題)類型:

<SearchResults PageSize="1" PageIndex="0" TotalCount="342"> 

<SearchResult> 

    <ContentId>994</ContentId> 

    <Title>Help Files: What are they written in?</Title> 

    <Url>http://myserver/linktest.aspx</Url> 

    <Date>2008-10-16T16:18:00+01:00</Date><ContentType>post</ContentType> 

    <Body><div class="ForumPostBodyArea"> <div class="ForumPostContentText"> <p>Can anyone see anything obviously wrong with this xml, when its fired to CRM Its creating 13 null records.</p> <p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;soap:Envelope xmlns:typens="<a href="http://tempuri.org/type">http://tempuri.org/type</a>" soap:encodingStyle="<a href="http://schemas.xmlsoap.org/soap/encoding/">http://schemas.xmlsoap.org/soap/encoding/</a>" xmlns:soap="<a href="http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/</a>" xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>" xmlns:soapenc="<a href="http://schemas.xmlsoap.org/soap/encoding/">http://schemas.xmlsoap.org/soap/encoding/</a>" xmlns:wsdlns="<a href="http://tempuri.org/wsdl/">http://tempuri.org/wsdl/</a>" xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema%22%3E%3Csoap:Header%3E%3CSessionHeader%3E%3CsessionId">http://www.w3.org/2001/XMLSchema"&gt;&lt;soap:Header&gt;&lt;SessionHeader&gt;&lt;sessionId</a> xsi:type="xsd:long"&gt;18208442035524&lt;/sessionId&gt;&lt;/SessionHeader&gt;&lt;/soap:Header&gt;&lt;soap:Body&gt;&lt;typens:add&gt;&lt;entityname xsi:type="xsd:string"&gt;lead&lt;/entityname&gt;&lt;records xsi:nil="true" xsi:type="typens:ewarebase" /&gt;&lt;status xsi:type="xsd:string"&gt;PreRegistration&lt;/status&gt;&lt;requester xsi:type="xsd:string"&gt;Mimnagh&lt;/requester&gt;&lt;personfirstname xsi:type="xsd:string"&gt;Sean&lt;/personfirstname&gt;&lt;personlastname xsi:type="xsd:string"&gt;Test2&lt;/personlastname&gt;&lt;personsalutation xsi:type="xsd:string"&gt;Mr&lt;/personsalutation&gt;&lt;details xsi:type="xsd:string"&gt;test project details&lt;/details&gt;&lt;description xsi:type="xsd:string"&gt;test description details&lt;/description&gt;&lt;comments xsi:type="xsd:string"&gt;test project comments&lt;/comments&gt;&lt;personemail xsi:type="xsd:string"&gt;[email protected]&lt;/personemail&gt;&lt;personphonenumber xsi:type="xsd:string"&gt;12334566777&lt;/personphonenumber&gt;&lt;type xsi:type="xsd:string"&gt;PreReg&lt;/type&gt;&lt;companyname xsi:type="xsd:string"&gt;Site Client&lt;/companyname&gt;&lt;/typens:add&gt;&lt;/soap:Body&gt;&lt;/soap:Envelope&gt;</p> <p>Many thanks</p> </div> </div> 
</Body> 

    <Tags> 
    <Tag>xml</Tag> 
    </Tags> 

    <IndexedAt>2010-07-08T11:53:46.848+01:00</IndexedAt> 

</SearchResult> 

</SearchResults> 

有沒有什麼,我可以用xmlreader做,使其忽略任何導致問題?

請注意,在使用XML之前我無法更改XML - 所以如果格式不正確,我不知道是否有辦法忽略或修改該特定記錄而不會產生錯誤?

謝謝!

回答

1

它看起來像你的一些引號需要在你的一些元素的內容中轉義。嘗試使用

&quot; 

用於未包裝屬性值的引號。

UPDATE:

因爲要讀取的數據是沒有嚴格的XML(這是 XML)你最好的選擇是

  1. 要麼你或你的老闆,如果你有一個人向第三方尖叫,因爲他們沒有給你發送格式良好的XML。
  2. 執行一些可怕的黑客手段來嘗試將任何可能獲得的內容轉換爲XML。

如果你必須去與點2,彈出到我頭上的最簡單的事情是閱讀「XML」進出尖括號計數的字符。如果您發現任何「字符,你沒有任何尖括號內,取代」與

&quot; 

但是請注意,這樣做是一個完整的不得已而爲之。

1

您的<Body>標籤的內容結構不正確。 XML對數據的語法非常嚴格。將CDATA部分嵌入到XML中或正確地轉義字符串。

+0

我無法控制XML,因爲它來自第三方應用程序。所以我需要一些方法來處理它的畸形狀態。 – 2010-07-27 13:07:46