C#中的XmlSchemaElement排序顺序

时间:2013-02-25 17:14:47

标签: c# xsd

我正在比较基于相同XMLSchema的两个XML。 XML中的每个元素都有一个id(id不说明顺序 - 最旧的xmlElement具有最低的id,依此类推)。 我的目标是在两个XMLS之间进行一致。

举一个非常简单的例子。 让两个xmls。第一个看起来像这样:

<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:2,100:100开始。这时我遇到了两个名字不同的xml元素。我知道它们可能不匹配,所以两种可能的解决方案是采用3:*(其中* =符号表示不匹配)然后*:4或采用:4然后3: 。 但只有一种方法是正确的解决方案,因为架构说UnknownOrderEle2(id = 4)应该在UnknownOrderEle1之前(id = 3。

所以我在XmlSchema类中查找了任何内容,XmlSchemaInfoXmlSchemaElement,......告诉我有关元素顺序的任何信息。我找到的唯一两种可能性对我来说都不是真正的解决方案,因为它们太耗时或不洁净。 一种方法是比较LineNumber内的LinePositionXmlSchemaObject(可能是不干净的)。 另一个是从两个xmls中构造一个xml并验证它。如果它抛出验证异常,我知道我选择的顺序是错误的(绝对耗时)。

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

1 个答案:

答案 0 :(得分:0)

与您的示例对应的架构应包含以下内容:

<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文件并尝试验证它的方法可能会更好。