2017-09-15 9 views
1

私は現在、2つのxmlを比較するときに問題を抱えています。問題は、異なる子オーダーと比較するためにワイルドカードを適用しようとするときです。追加で、それらの子ノードの属性数がノード内で異なるため、比較がさらに難しくなります。XMLDiff/XMLUnit - 子オーダーを無視してワイルドカードを使用する

XMLUnit & .NET用のXMLDiffライブラリを使用してソリューションを実装しようとしましたが、成功しませんでした。

using System; 
using Org.XmlUnit.Builder; 
using Org.XmlUnit.Diff; 
using System.IO; 

static void Main(string[] args) 
    { 
     string orgFilePath = @"C:\Temp\original.xml"; 
     string refFilePath = @"C:\Temp\reference.xml"; 

     StreamReader orgStreamReader = new StreamReader(orgFilePath); 
     StreamReader refStreamReader = new StreamReader(refFilePath); 

     String orgFile = XDocument.Load(orgStreamReader).ToString(); 
     String refFile = XDocument.Load(refStreamReader).ToString(); 

     var diff = DiffBuilder 
      .Compare(Input.FromString(orgFile)) 
      .WithTest(Input.FromString(refFile)) 
      .CheckForSimilar() 
      .Build(); 

     foreach (var d in) 
     { 
      Console.WriteLine(d.Comparison); 
      Console.WriteLine(); 
     } 
     Console.WriteLine(diff.Differences); 

     Console.ReadLine(); 
    } 

参照ファイル:

<deviceOrders> 
    <deviceOrder> 
     <operation>New</operation> 
     <moduleId>*</moduleId> 
     <net>TST</net> 
     <sort>VT</sort> 
     <moduleNr>220</moduleNr> 
     <deviceNr>0</deviceNr> 
    </deviceOrder> 
    <deviceOrder> 
     <operation>New</operation> 
     <moduleId>*</moduleId> 
     <net>79ST</net> 
     <sort>UP</sort> 
     <deviceNr>0</deviceNr> 
    </deviceOrder> 
</deviceOrders> 

ORGファイル:

<deviceOrders> 
    <deviceOrder> 
     <operation>New</operation> 
     <moduleId>1235</moduleId> 
     <net>79ST</net> 
     <sort>UP</sort> 
     <deviceNr>0</deviceNr> 
    </deviceOrder> 
    <deviceOrder> 
     <operation>New</operation> 
     <moduleId>1234</moduleId> 
     <net>TST</net> 
     <sort>VT</sort> 
     <moduleNr>220</moduleNr> 
     <deviceNr>0</deviceNr> 
    </deviceOrder> 
</deviceOrders> 

私はまだそのために私を助けてください解決策を見つけることができませんでした。

+0

多分それはうまくいくかもしれませんが、可能なすべての子と属性を反映するクラスを定義し、オプションのものをヌル可能にしてから、両方のXMLを逆シリアル化してもう一度シリアル化します。同じ構造を持つ2つのXMLを持つ必要があります。 – LocEngineer

答えて

0

はこれを実行してみ:

using System; 
using System.Reflection; 
using System.Linq; 
using System.Xml.Linq; 

namespace ConsoleApp1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string xml1 = "<?xml version=\"1.0\" encoding=\"UTF - 8\"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>"; 
      string xml2 = "<?xml version=\"1.0\" encoding=\"UTF - 8\"?> <note> <to>dd22</to> <from>Jani</from> <heading>4fewfewe</heading> <body>Don't forget me this weekend!</body> </note>"; 

      XDocument doc1 = XDocument.Parse(xml1); 
      XDocument doc2 = XDocument.Parse(xml2); 
      Console.WriteLine("Elements in document 1"); 
      foreach (string Different in doc1.Elements().Elements().Select(x => x.Value)) 
      { 
       Console.WriteLine("1----"+Different); 
      } 
      Console.Read(); 

      Console.WriteLine("Elements in document 2"); 
      foreach (string Different in doc2.Elements().Elements().Select(x => x.Value)) 
      { 
       Console.WriteLine("2----" + Different); 
      } 

      Console.Read(); 

      Console.WriteLine("These are the equal elements, I will discard different ones"); 
      foreach (string Different in doc1.Elements().Elements().Select(x => x.Value).Intersect(doc2.Elements().Elements().Select(x => x.Value))) 
      { 
       Console.WriteLine(Different); 
      } 
      Console.Read(); 
     } 
    } 
} 

それだけ等しい要素を取得します。 foreach内のLINQを変更して、必要なものを入手します。

子孫で操作する要素のレベルでノード値の交差を行います。あなたはあなたのXMLに同じことをすることができます。

+0

これは本当にそこの問題を解決しません。あなたのシナリオでは、交差点を起動すると、異なる属性であっても同じ値をチェックします。解決策は、XMLノードの階層的な特性を維持しなければならない。とにかくあなたの貢献に感謝します。 – codi89

+0

@ codi89あなたはこのコミュニティの精神を知らないかもしれません。ちょっとちょっと、私はこれをpl0xを解くだけではない。 ReflectionまたはXElementの名前プロパティを使用して階層ツリーと名前を簡単に保持し、私が書いたコードから簡単に解決できます。それは難しいことではありませんし、ノード名と位置を比較したり、自分のコードで簡単に別の要素を取得することができます –

関連する問題