如何解决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 举报,一经查实,本站将立刻删除。