2013-02-25 54 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