问题描述
我们从无法控制的源中提取了数千个 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 (将#修改为@)