2010-07-27 61 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