C#中的XmlSchemaElement排序顺序
本文关键字:顺序 排序 XmlSchemaElement 中的 | 更新日期: 2023-09-27 18:00:55
我正在比较基于同一XMLSchema的两个XML。XML中的每个元素都有一个id(id没有说明顺序——最旧的xmlElement有最低的id,依此类推(。我的目标是在两个XMLS之间取得某种程度的一致性。
举一个非常简单的例子。假设有两个xml。第一个看起来像这样:
<EleType>
<Ele id="1"/>
<Name id="2"/>
<Description id="100"/>
<UnknownOrderEle1 id="3"/>
</EleType>
第二个是这样的:
<EleType>
<Ele id="1"/>
<Name id="2"/>
<Description id="100"/>
<UnknownOrderEle2 id="4"/>
</EleType>
我的结果应该是id的映射。它将以1:1开始,然后是2:2100:100。此时,我遇到了两个名称不同的xml元素。我知道它们可能不匹配,所以两种可能的解决方案是取3:*(其中*=不匹配的符号(,然后取*:4,或者取:4,然后取3:。但是只有一种方法是正确的解决方案,因为模式说UnknownOrderEle2(id=4(应该在UnknownOrderEle1(id=3(之前。
所以我在XmlSchema类XmlSchemaInfo
、XmlSchemaElement
中查找任何内容,。。。那个告诉我关于元素顺序的一切。我发现的仅有的两种可能性对我来说并不是真正的解决方案,因为它们要么太耗时,要么不干净。一种是比较XmlSchemaObject
中的LineNumber
和LinePosition
(可能不干净(。另一种方法是从两个xml中构造一个xml并对其进行验证。如果它抛出验证异常,我知道我选择的顺序是错误的(肯定很耗时(。
如果有人知道更好的解决方案,我很乐意得到任何帮助。
与您的示例对应的模式应该包含这样的内容:
<xs:element name="EleType">
<xs:complexType>
<xs:sequence>
<xs:element name="Ele">
. . .
</xs:element>
<xs:element name="Name">
. . .
</xs:element>
<xs:element name="Description">
. . .
</xs:element>
<xs:element name="UnknownOrderEle1">
. . .
</xs:element>
<xs:element name="UnknownOrderEle2">
. . .
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
加载后,您可以获得相应的XmlSchemaElement
对象,然后使用以下代码获取其子元素的顺序:
XmlSchemaElement element = schema.Elements[new XmlQualifiedName("EleType")];
XmlSchemaType complexType = (XmlSchemaComplexType)element.ElementSchemaType;
XmlSchemaSequence sequence = (XmlSchemaSequence)complexType.Particle;
XmlSchemaObjectCollection childElements = sequence.Items;
childElements
是按正确顺序排列的有效子元素Ele
、Name
、Description
、UnknownOrderEle1
、UnknownOrderEle2
的列表。
只要你的模式很简单,这就行,但如果类型的定义不是简单的序列,而是更复杂的——使用choice
、组等等,它就会变得更复杂,以至于创建XML文件并尝试验证它的其他方法可能会变得更好。