2011-09-16 35 views
0

2つのXMLファイルを比較したいと思います。 両方が同じ構造を持つ場合は簡単に見えます。しかし、ではない私の場合:( 私のファイルのようになります。タスクのみを比較するためXML比較ツールC#

  1. ある

    <root> 
    <t> 
        <child1> 
        <cc1>val</cc1> 
        <cc2>val</cc2> 
        ...... 
        </child1> 
        <child2> 
        <cc1>val</cc1> 
        <cc2>val</cc2> 
        ...... 
        </child2> 
        <child2> 
        <cc1>val</cc1> 
        <cc2>val</cc2> 
        ...... 
        </child2> 
        ....... 
        <child3> 
        <cc1>val</cc1> 
        <cc2>val</cc2> 
        ...... 
        </child3> 
        .... 
    </t> 
    <t> 
        ... 
    </t> 
    ..... 
    </root> 
    

    そして、彼らはCHILDES、およびCHILDESのCHILDESの任意の番号を持っている可能性が... (この例ではchild1.cc1.value)

  2. 比較の間に、いくつかのノードをスキップすることができます(スキップされたノードの名前は、たとえばどこかに格納されています)。文字列配列)

  3. 同じ複数のノードを持つことは可能です。 child2が無視されない場合、それらが同じ量であることを確認する必要があり、それらはすべて対応する第2ファイルと一致します。だから、次のような状況があるかもしれません:

第一のファイルが含まれます。

<child2><cc1>2</cc1>...</child2> 
<child2><cc1>1</cc1>...</child2> 
<child2><cc1>3</cc1>...</child2> 

をそして、それは彼らが互いに対応であることを意味します:

<child2><cc1>1</cc1>...</child2> 
<child2><cc1>3</cc1>...</child2> 
<child2><cc1>2</cc1>...</child2> 

2STファイルが含まれています。 それで、彼らはランダムな順序になる可能性があります。

今、このアルゴリズムを実現する方法を決定することはできません。私はDataSetオブジェクトを使用することを提案しましたが、このXML構造はDataTables、dataRowsなどを使用するだけではあまりにも困難です。

今はXmlNodesを試しています。しかし、私はランダムな順序で異なるデータを持ついくつかの同一のノードを持つ部分を認識していません。

アイデア?

答えて

2

XMLファイルのサイズはどれくらいですか?そして、現実の構造はどれだけ複雑ですか?

大きすぎたり複雑でない場合は、ファイル全体を解析してクラスのプロパティを検証することをお勧めします。例(擬似コード)について...

xmlClass file1 = new xmlClass(file1info); 
xmlClass file2 = new xmlClass(file2info); 

//Custom classes have now parsed XML files in whichever way you like 

if (file1.numberOfChildren != file2.numberOfChildren) 
{ 
    //comparison fail 
} 
elseif (!file1.orderOfChildrenSame(file2)) 
{ 
    //comparison fail 
} 
else 
{ 
    //comparison success 
} 

は明らかにあなたのxmlClassのメソッドとプロパティの正確な実装は、あなたの正確な要件に依存します。

XmlClassはラフレイアウトとすることができる...

using System; 
using System.Collections.Generic; 
using System.Xml; 

public class XmlClass 
{ 
    private XmlDocument _xmlDoc; 
    private List<ChildClass> _children As New List<ChildClass>(); 

    public XmlClass(FileInfo fil){ 
     _xmlDoc = New XmlDocument(); 
     _xmlDoc.Load(fil.FullName); 

     ParseChildren(); 

     _xmlDoc = Nothing; 
    } 

    private void ParseChildren(){ 
     XmlNodeList ndl = _xmlDoc.SelectNodes("/root/t") //select all <t>s 
     foreach (xmlNode nodT in ndl.Nodes){ 
      foreach (xmlNode nodChild in nodT.ChildNodes()){ 
       _children.Add(new ChildClass(nodChild)); 
      } 
     } 
     // Now _children contains all child nodes of <t>s and can be worked with logically 
    } 

    public int numberOfChildren 
    { 
     get {return _children.Count();} 
    } 
} 

は、あなたは明らかChildClassを実装する必要があります - 今度は(あなたが記述階層を可能)ChildClass自身のコレクションを含むことができます。また、必要に応じて他の検証メソッドを実装する必要があります。また、他のクラスを実装して、興味のある文書内の他のノードタイプを表す必要があるかもしれません。

検証するために必要以上に解析しないでください!それはあなたの最終目標が何であるかによって異なります。

PS

私はまた、このXML形式は<child1><child2>セットアップの面で非常に「良い」ではないことを示唆しています。それは

+0

>> '<子ID = "1">、<子ID =」...はるかXMLesqueは、本質的に、おそらく<child1><child2>されているのと同じタイプのノードのとして<child id="1"><child id="2">などを持っているだろう2 ">' ああ、もし私が選択することができます... しかし、あなたのアイデアは非常にきれいです!少なくとも私はそれが好きで、私は試してみます。 – Ksice

+0

@Ksice私はそれがとてもきれいだとは思わないでしょう!しかし、XML文書の整合性を検証するために同様のコードを使用しました。クラスに分割することで、あなたの心の中の問題も明確にすることができます。 btw上記のコードは完全にテストされていない - いくつかの微調整が必​​要な場合があります:) –