2013-02-25 52 views
0

我正在比较基于相同XMLSchema的两个XML。 XML中的每个元素都有一个id(id没有说明顺序 - 最老的xmlElement具有最低的id等等)。 我的目标是获得两种XMLS之间的一致性。C#中的XmlSchemaElement排序顺序

给出一个非常简单的例子。 让有两个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:2,100:100。在这一刻,我遇到了两个不同名称的XML元素。我知道它们可能不匹配,所以两种可能的解决方案是采用3:*(其中* =符号不匹配),然后是*:4或采取:4然后3:。 但只有一个办法是正确的解决方案,因为该方案说,UnknownOrderEle2(ID = 4)要来UnknownOrderEle1(ID = 3。前

所以我找过的XmlSchema类中的任何东西,XmlSchemaInfoXmlSchemaElement,...它告诉我任何有关元素顺序的信息,我发现的唯一两种可能性对我来说并不是真正的解决方案,因为它们要么太耗时,要么不干净。 另一种方法是从两个xml中构建一个xml并验证它,如果它抛出一个验证异常,我知道我选择的顺序是错误的(绝对耗时)

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

回答

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是有效的子元素EleNameDescriptionUnknownOrderEle1,名单,按正确的顺序。

只要您的模式很简单,但是如果类型的定义不是简单的序列,而是更复杂的 - 使用choice,组等等,它会变得更复杂,以至于另一种方法创建一个XML文件并尝试验证它可能会更好。

+0

感谢您的快速回答。我的模式比较复杂,但比较也是一个非常有限的因素。我正递归地比较数百个XML,所以我根本无法验证每个可能的比较差异。根据你的解决方案,我会尝试更复杂的方法,如果它不太长,它会在这里发布;-) – Akrostichon 2013-02-26 12:46:53