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 (将#修改为@)