将XML反序列化为多个模式中定义的对象

时间:2009-06-08 20:09:43

标签: c# xml xml-serialization

我有一个XML文档,其中包含来自2个XML模式的类型。一个(theirs.xsd)是我正在集成(并且无法编辑)的专有模式。为此,我定义了我自己的类型(mine.xsd),它是'any'元素中的一个元素是专有类型。

我使用Visual Studio的xsd.exe从模式生成C#类。但是,专有类型中的“any”元素是作为XmlElement []生成的,因此我的类型不会被反序列化。

所以我想我可以采用以下两种方法之一:生成将反序列化我的类型而不是将其保存为XmlElement的类,或者单独使用XmlElements并反序列化它们。要反序列化我需要一个XmlReader,所以我需要从XmlElement转到XmlReader,我不知道该怎么做。感谢。

实施例: 文件:theirs.xsd

<xs:element name="ProprietaryContainer">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

文件:mine.xsd

<xs:element name="MyPairType">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="key" type="xs:string"/>
      <xs:element name="value" type="xs:long"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

文件:message.xml

<their:ProprietaryContainer>
  <their:name>pairContainer</their:name>
  <mine:MyPairType>
    <mine:key>abc</mine:key>
    <mine:value>long</mine:value>
  </mine:MyPairType>
</their:ProprietaryContainer>

1 个答案:

答案 0 :(得分:1)

从问题:

  

要反序列化我需要一个XmlReader,所以我需要从XmlElement转到XmlReader,我不知道该怎么做

using(XmlReader reader = new XmlNodeReader(element)) {
    //... use reader
}