2010-07-27 3 views
1

Я использую C# для взаимодействия с базой данных с открытым REST API. В таблице, в которой я заинтересован, содержатся сообщения на форуме, некоторые из которых сами содержат xml.Как обрабатывать xml, содержащий вложенный xml с помощью C# xmlreader?

Всякий раз, когда мой результирующий набор содержит пост, который имеет 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 до его потребления, поэтому, если он неверен, возникает вопрос, есть ли способ игнорировать или модифицировать эту конкретную запись без возникновения ошибки?

Спасибо!

ответ

1

Похоже, что некоторые из ваших цитат нуждаются в утечке содержимого некоторых ваших элементов. Попробуйте использовать

&quot; 

для кавычек, которые не являются атрибутами атрибутов.

UPDATE:

Поскольку данные, которые вы хотите читать не является строго XML (это почти XML) вы лучше всего

  1. Либо вы или ваш босс, если вы есть один, кричит на третьей стороне, потому что они не отправляют вам хорошо сформированный XML.
  2. Выполните некоторые ужасные взломы, чтобы попытаться преобразовать все, что вы можете получить в XML.

Если вам нужно идти с точкой 2, то самая простая вещь, которая появляется в моей голове, - это прочитать символы «XML», подсчитывающие и скопированные углы. Если вы обнаружите какие-либо «символы, и вы не в каких-либо угловых скобках, заменить» с

&quot; 

Но обратите внимание, что делает это полный последнее средство.

1

Содержимое вашей метки <Body> не совсем сформировано. XML очень строг с синтаксисом данных. Либо вставьте раздел CDATA в свой XML, либо выбери строку правильно.

+0

У меня нет контроля над XML, поскольку он поступает из стороннего приложения. Поэтому мне нужно каким-то образом справиться с этим в своем неправильном состоянии. –

Смежные вопросы