Как десериализовать XML внутри XML? - PullRequest
1 голос
/ 10 декабря 2011

У меня есть этот XML:

<Record>
    <ID>123</ID>
    <Question>Question goes here...</Question>
    <Answer>Answer goes here...</Answer>
    <ExtentedAnswer>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;ExtendedResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" DataType="12" xmlns="http://schemas.example.com/"&gt;&lt;ComplexText&gt;&lt;CityStateZip&gt;&lt;City&gt;Clifton&lt;/City&gt;&lt;State&gt;VA&lt;/State&gt;&lt;Zip&gt;20124&lt;/Zip&gt;&lt;Country&gt;US&lt;/Country&gt;&lt;/CityStateZip&gt;&lt;/ComplexText&gt;&lt;/ExtendedResponse&gt;</ExtentedAnswer>
</Record>

Десериализация работает нормально, но я получаю ExtentedAnswer как String.Можно ли десериализовать XML внутри ExtentedAnswer за один раз?Я знаю, что могу десериализовать расширенный ответ отдельно.

Ответы [ 4 ]

3 голосов
/ 10 декабря 2011

Мы решили эту проблему на нашем рабочем месте. В нашем конкретном случае проблема заключалась в том, чтобы преобразовать текст с помощью XSLT, что было очень сложно, но действительно возможно. В коде это менее сложно, как предлагают другие авторы, просто замените escape-коды на < и > и проанализируйте их с помощью обычного парсера.

Однако, похоже, вам нужно одношаговое решение. Я очень сомневаюсь, что стандартный XML Serializer сможет это сделать, поскольку он не знает, какие элементы содержат экранированный XML-контент. Экранированный текст специально предназначен для того, чтобы парсеры xml не могли его обнаружить, поэтому решение, выбранное вручную, вероятно, является единственным вариантом. Ваш класс должен реализовать IXmlSerializable и выполнить преобразование текста самостоятельно.

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

1 голос
/ 10 декабря 2011

да, вы можете сделать, но xml должен хранить ExtentedAnswer следующим образом: -

  <ExtentedAnswer>
    <![CDATA[
    <?xml version="1.0" encoding="utf-16"?>
    <ExtendedResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" DataType="12" xmlns="http://schemas.example.com/">
      <ComplexText>
        <CityStateZip>
          <City>Clifton</City>
          <State>VA</State>
          <Zip>20124</Zip>
          <Country>US</Country>
        </CityStateZip>
      </ComplexText>
    </ExtendedResponse>
    ]]>
  </ExtentedAnswer>
1 голос
/ 10 декабря 2011

Вы сможете заменить &amp;lt; символом < и &amp;gt; символом >.Это даст вам строку, которую вы можете использовать с читателем XML.

0 голосов
/ 10 декабря 2011

Это возможно, если вы сделаете это возможным. Если вы просто делаете это в одном месте, то я бы делал это отдельно, но если вам нужно делать это во многих местах, вы можете написать класс, который сделает это за вас, а затем использовать его там, где вам это нужно.

...