2011-12-10 146 views
1

我有这样的XML:如何在XML中反序列化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。是否有可能在ExtentedAnswer中一次性反序列化XML。我知道我可以单独反序列化ExtentedAnswer。

回答

3

我们已经在我们的工作场所解决了这个问题。在我们的具体情况中,问题在于将文本转换为XSLT,这非常痛苦,但确实可行。在代码中,它并不像其他海报所建议的那样复杂,只需将转义码替换为<>,然后使用普通的解析器对其进行解析。

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

最后,我强烈建议,如果您对创建此数据的过程有任何控制权,那么您首先应该不要存储转义xml并找到另一个解决方案。与合作是一件令人讨厌的事情,我想不出任何真正有必要的情况。

+0

谢谢。可悲的是,我不负责生成XML。那么,就像现在看来的那样,为了使它工作起来,我将分开进行,随后将会推出IXmlSerializable实现。 –

1

您应该能够用<字符替换&amp;lt;,用>字符替换&amp;gt;。这会给你一个字符串,你可以使用XML阅读器。

0

这是可能的,如果你让它成为可能。如果你只是在一个地方做这件事,那我就单独做,但如果你需要在很多地方做到这一点,那么你可以写一个类来为你做这个,然后在你需要它的地方使用它。

+0

嗯,我知道它可以单独完成。我只是想知道是否可以立即执行反序列化,并且XML部分内部可以聚合为根。 –

+0

是的,我明白了。我的意思是,如果你没有找到像你想的那样一步到位的方法,那么确保你在一个地方封装了这些步骤,而不是每次需要阅读XML时都要执行多个步骤数据。 –

1

是的,你可以做,但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> 
+0

是的。它会工作。谢谢。但我不负责生成XML。 –