【问题标题】:How to Deserialize XML inside XML?如何在 XML 中反序列化 XML?
【发布时间】:2011-12-10 09:58:42
【问题描述】:

我有这个 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 作为字符串。是否可以一次性反序列化 ExtentedAnswer 中的 XML。我知道我可以单独反序列化 ExtentedAnswer。

【问题讨论】:

    标签: c# xml xml-serialization xml-deserialization


    【解决方案1】:

    我们已经在工作场所解决了这个问题。在我们的具体案例中,问题是使用 XSLT 转换文本,这非常痛苦,但确实是可能的。正如其他海报所建议的那样,在代码中它不那么复杂,只需将转义码替换为&lt;&gt; 并使用普通解析器进行解析。

    但是,您似乎需要一个单步解决方案。我非常怀疑标准 XML 序列化器是否能够做到这一点,因为它不知道哪些元素包含转义的 xml 内容。转义文本专门用于阻止 xml 解析器检测到它,因此手动解决方案可能是您唯一的选择。您的类应该实现 IXmlSerializable 并自行执行文本转换。

    最后,我强烈建议如果您对创建此数据的过程有任何控制权,那么您不要 存储转义的 xml 并找到其他解决方案。与它一起工作很麻烦,我想不出任何真正需要它的情况。

    【讨论】:

    • 谢谢。遗憾的是,我不负责生成 XML。好吧,现在看来,为了让它工作,我将单独做它,稍后将推出 IXmlSerializable 实现。
    【解决方案2】:

    是的,您可以这样做,但 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>
    

    【讨论】:

    • 是的。它会起作用的。谢谢。但我不负责生成 XML。
    【解决方案3】:

    您应该能够将&amp;amp;lt; 替换为&lt; 字符,并将&amp;amp;gt; 替换为&gt; 字符。这将为您提供一个可用于 XML 阅读器的字符串。

    【讨论】:

      【解决方案4】:

      如果你让它成为可能,它就是可能的。如果您只是在一个地方执行此操作,那么我将单独执行此操作,但是如果您需要在许多地方执行此操作,那么您可以编写一个可以为您执行此操作的类,然后在您需要的任何地方使用它。

      【讨论】:

      • 嗯,我知道可以分开做。我只是想知道这是否可以一次反序列化,并且内部 XML 部分可以聚合到根目录。
      • 是的,我明白了。我的意思是,如果您没有像您想要的那样在一个步骤中找到一种方法,那么请确保将步骤封装在一个地方,而不是每次需要阅读 xml 时都执行多个步骤数据。
      猜你喜欢
      • 2019-04-24
      • 1970-01-01
      • 2015-04-13
      • 1970-01-01
      • 2012-03-04
      • 2011-03-03
      相关资源
      最近更新 更多