Как обработать xml, который содержит вложенный xml, использующий c# xmlreader?

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

Каждый раз, когда мой набор результатов содержит сообщение, которое имеет xml, мое приложение бросает ошибку следующим образом:

Детали исключения: Система. 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;smimnagh@mac.com&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
задан Farthest Shore 27 July 2010 в 13:19
поделиться

2 ответа

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

&quot;

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

ОБНОВЛЕНИЕ:

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

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

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

&quot;

. Но учтите, что это будет крайним средством.

1
ответ дан 2 September 2019 в 22:41
поделиться

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

1
ответ дан 2 September 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: