2012-03-17 10 views
0

2つ(以上)のXMLファイルをタグ名と属性名で比較したいと考えています。属性やノードの値には興味がありません。C#のノード名と属性名によるXMLの比較

Googleで検索したところ、XMLDiff Patch(http://msdn.microsoft.com/en-us/library/aa302294.aspx)が見つかりませんでしたが、私にとってはうまくいきませんでした。または、私の設定で作業する方法がわかりません。これら二つのファイルがなければなりません ファイル

<info> 
    <Retrieve> 
    <LastNameInfo> 
     <LNameNum attribute="some_val">1</LNameNum> 
     <NumPeople>1</NumPeople> 
     <NameType/> 
     <LName>TEST</LName> 
    </LastNameInfo> 
    <Segment> 
     <SegNum>1</SegNum> 
     <Comment>A test</Comment> 
    </Segment> 
    <Segment> 
     <SegNum>2</SegNum> 
     <Dt>20110910</Dt> 
     <Comment>B test</Comment> 
    </Segment> 
    </Retrieve> 
</info> 

ファイルB

<info> 
    <Retrieve> 
    <LastNameInfo> 
     <LNameNum attribute="other_val">4</LNameNum> 
     <NumPeople>1</NumPeople> 
     <NameType/> 
     <LName>TEST7</LName> 
    </LastNameInfo> 
    <Segment> 
     <SegNum>1</SegNum> 
     <Comment>A test</Comment> 
    </Segment> 
    <Segment> 
     <SegNum>2</SegNum> 
     <Dt>20110910</Dt> 
     <Comment>B test</Comment> 
    </Segment> 
    </Retrieve> 
</info> 

に等しいです。

ありがとうございます!

+1

違いがあるかどうかだけ知る必要があるのでしょうか、それとも違いを知る必要がありますか? – Reinaldo

+0

@ Lloyd、よくLinqは機能DeepEqualsを持っていますが、属性値やノードの値が異なっていれば再試行されます。 @ Reinaldo、違いがあるかどうか。 – Urmelinho

+0

Xmldiffpatch.exeがうまくいかなかったということを意味しますか? – svick

答えて

1

"手動で"したいのであれば、再帰関数を使用してxml構造をループすることが考えられます。ここでは簡単な例です:

var xmlFileA = //first xml 
var xmlFileb = // second xml 

var docA = new XmlDocument(); 
var docB = new XmlDocument(); 

docA.LoadXml(xmlFileA); 
docB.LoadXml(xmlFileb); 

var isDifferent = HaveDiferentStructure(docA.ChildNodes, docB.ChildNodes); 
Console.WriteLine("----->>> isDifferent: " + isDifferent.ToString()); 

は、これはあなたの再帰関数である:

private bool HaveDiferentStructure(
      XmlNodeList xmlNodeListA, XmlNodeList xmlNodeListB) 
{ 
    if(xmlNodeListA.Count != xmlNodeListB.Count) return true;     

    for(var i=0; i < xmlNodeListA.Count; i++) 
    { 
     var nodeA = xmlNodeListA[i]; 
     var nodeB = xmlNodeListB[i]; 

     if (nodeA.Attributes == null) 
     { 
       if (nodeB.Attributes != null) 
        return true; 
       else 
        continue; 
     } 

     if(nodeA.Attributes.Count != nodeB.Attributes.Count 
       || nodeA.Name != nodeB.Name) return true; 

     for(var j=0; j < nodeA.Attributes.Count; j++) 
     { 
       var attrA = nodeA.Attributes[j]; 
       var attrB = nodeB.Attributes[j]; 

       if (attrA.Name != attrB.Name) return true; 
      } 

      if (nodeA.HasChildNodes && nodeB.HasChildNodes) 
      { 
       return HaveDiferentStructure(nodeA.ChildNodes, nodeB.ChildNodes); 
      } 
      else 
      { 
       return true; 
      } 
    } 
    return false; 
} 

ノードと属性が同じ順序であるとして、これが唯一の限りtrueを返しますことを心に留めておく、としてください両方のXMLファイルに同じケーシングが使用されています。属性/ノードを含めるか除外するように拡張することができます。

希望すると助かります!

+0

私は最後の瞬間まで、このような手作業を手動で行う必要はありません。私はこの解決策を知っていたが、私はライブラリを見つけることを望んだ。 ありがとうございます! – Urmelinho

関連する問題