2012-02-29 7 views
0

2つのXMLファイルを比較し、デルタのみでXMLを生成できますか?2つのXMLファイルを比較

例えば、これは私のXMLです:

<?xml version="1.0" encoding="utf-8"?> 
<Events> 
<Event id="1" date="2012-02-29"> 
<Event id="2" date="2012-02-29"> 
<Event id="3" date="2012-02-29"> 
<Event id="4" date="2012-02-29"> 
<Event id="5" date="2012-02-29"> 
</Events> 

そして、このXML:

<?xml version="1.0" encoding="utf-8"?> 
<Events> 
<Event id="1" date="2012-02-29"> 
<Event id="2" date="2012-02-29"> 
<Event id="3" date="2012-02-29"> 
<Event id="4" date="2012-02-29"> 
<Event id="5" date="2012-03-01"> 
<Event id="6" date="2012-03-01"> 
<Event id="7" date="2012-03-07"> 
</Events> 

それでは、私はすべての後に取得することになります。

<?xml version="1.0" encoding="utf-8"?> 
<Events> 
<Event id="5" date="2012-03-01"> 
<Event id="6" date="2012-03-01"> 
<Event id="7" date="2012-03-07"> 
</Events> 

ので: イベントID 5は日付を変更し、6と7は新しい日付です。

C#でどうすればいいですか?

+1

これは間違いなく可能です。これまでに何を試しましたか? –

+0

実際には何も、そのようなことにアクセスする方法は分かりません。誰かがこれまでにこれをしていたと確信しています.. –

+0

私はXmlReaderを調べ、両方のファイルをこの方法で他のデータ構造に読み込み、最後にXmlWriterを使用して結果を出力します。 – user17753

答えて

1

この特定の例では、のために違いを取得するのは非常に簡単です、それはあなたが2 xmlファイルを比較することができます。実際のXMLファイルは、このようなものであれば、あなたはこのコードを適応しようとすることができます:

var doc1 = XDocument.Load(infile1); 
var doc2 = XDocument.Load(infile2); 
var dict = doc1.Root.Elements("Event").ToDictionary(el => 
    el.Attribute("id").Value); 
doc2.Root.Elements("Event").ToList().ForEach(el => { 
    XElement el2; 
    if (dict.TryGetValue(el.Attribute("id").Value, out el2) && 
     !el.Attributes().Select(a => new { a.Name, a.Value }).Except(
     el2.Attributes().Select(a => new { a.Name, a.Value })).Any()) 
      el.Remove(); 
}); 
doc2.Save(outfile); 
3

xmldiffのパッチとGUIツールをチェックしてみてください。 http://msdn.microsoft.com/en-us/library/aa302295.aspx

このページの上部にあるexeファイルのダウンロードリンクがあります - - http://msdn.microsoft.com/en-us/library/aa302294.aspx

+0

私は使用できるDLLはありますか?私はダウンロードページを見つけることができませんでした...あなたは少し助けることができますか?このツールを使用しましたか? –

+0

私はそれをコンパイルし、https://bitbucket.org/opticyclic/xmldiffpatchgui/overviewでインストーラを利用可能にしました – opticyclic

1

あなたは2個のXMLファイルのうち、DOMツリーを作成した場合、あなたはそれらの同等性を確保するために、両方のツリーをトラバースすることができます。私はあなたにこれを可能にするC#のDOMライブラリがあると確信しています。

また、XSLTで再帰的に横断し、C#でXSLTライブラリを使用して変換を適用し、後続のXML diffを出力します。

関連する問題