微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XML 反序列化 - 相同的元素名称不同的 xsi:type无需验证

如何解决XML 反序列化 - 相同的元素名称不同的 xsi:type无需验证

我们从无法控制的源中提取了数千个 XML 文件,它们具有相同的名称但不同的 xsi:type。我们想将这些 XML 反序列化为 C#,并且我们正在使用 xsd.exe 从这个 XSD 生成这个 C# 类。

我不确定我们是否能够修复我们生成的 XSD,或者我们是否需要从另一个角度处理问题(更改生成的 C# 类,这是一团糟,或者在某处添加一个层)。

根据我对 XML 1.0 的理解 xsi:type 可以用来实现这个愿望 xsi:type=" another-ns: ExportStatement" 但这不可能,因为我无法改变XML 文件

从我看来,唯一的区别是 ExportStatement 还有两个元素:

<xsd:element name="Letter" type="xsd:string" minOccurs="0" />
<xsd:element name="No" type="xsd:string" minOccurs="0" />

就像我说的,我们只使用 XSD 来生成类,我们不需要验证 XML 文件

这是 XML 文件的示例:

 <Phrase xsi:type="ExportPhrase" Id="114122" discriminatorId="292" SortOrder="0" PhraseField="0">
    <EuPhracPhraseId xsi:nil="true" />
    <AdditionalLocales />
    <MergePhrases />
    <Texts>
      <Text LocaleId="1">
        <Text><![CDATA[AData]]></Text>
      </Text>
      <Text LocaleId="2">
        <Text><![CDATA[BData]]></Text>
      </Text>
      <Text LocaleId="3">
        <Text><![CDATA[CData]]></Text>
      </Text>
      
    </Texts>
  </Phrase>
  <Phrase xsi:type="ExportStatement" Id="30010100" discriminatorId="1042" SortOrder="0" PhraseField="181">
    <EuPhracPhraseId xsi:nil="true" />
    <AdditionalLocales />
    <MergePhrases />
    <Letter>P</Letter>
    <No>101</No>
    <Texts>
      <Text LocaleId="1">
        <Text><![CDATA[EData]]></Text>
      </Text>
      <Text LocaleId="2">
        <Text><![CDATA[FData]]></Text>
      </Text>
      <Text LocaleId="3">
        <Text><![CDATA[GData]]></Text>
      </Text>
    </Texts>
  </Phrase>

XSD 的一部分:

<xsd:element name="Phrases">
<xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
            <xsd:element name="Phrase" type="ExportStatement" />
            <xsd:element name="Phrase" type="ExportPhrase" />
            <xsd:element name="ExportStatement" type="ExportStatement" />
        </xsd:choice>
</xsd:complexType>
</xsd:element>

XMLSerializer:

private static XMLDoc GetMaster(XmlSerializer xmlDocSerializer)
    {
        var masterFile = "XSD\\master.xml";
        TextReader masterReader = new StreamReader(masterFile,Encoding.Unicode);            
        var master = (XMLDoc)xmlDocSerializer.Deserialize(masterReader);
        return master;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。