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类XmlSchemaInfoXmlSchemaElement中查找任何内容,。。。那个告诉我关于元素顺序的一切。我发现的仅有的两种可能性对我来说并不是真正的解决方案,因为它们要么太耗时,要么不干净。一种是比较XmlSchemaObject中的LineNumberLinePosition(可能不干净(。另一种方法是从两个xml中构造一个xml并对其进行验证。如果它抛出验证异常,我知道我选择的顺序是错误的(肯定很耗时(。

如果有人知道更好的解决方案,我很乐意得到任何帮助。

C#中的XmlSchemaElement排序顺序

与您的示例对应的模式应该包含这样的内容:

<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是按正确顺序排列的有效子元素EleNameDescriptionUnknownOrderEle1UnknownOrderEle2的列表。

只要你的模式很简单,这就行,但如果类型的定义不是简单的序列,而是更复杂的——使用choice、组等等,它就会变得更复杂,以至于创建XML文件并尝试验证它的其他方法可能会变得更好。