2017-02-01 20 views
0

私はC#を使用しています。Xml要素をオーバーライド

は、私は2つのxmlファイルのthatsのは、同じexecpt特定の要素の値を見て持っている:

元のファイル:

<tasks> 
    <task id="1" > 
    <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#"> 
     <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" /> 
     <CipherData> 
     <CipherValue>+bv8xdFfDzXai3rB1D+c2voJ/mRkuQHJfV34iWB2wyezR3wxG5UnLmznq4i2emIh4Z+8KukZEKJmM8=</CipherValue> 
     </CipherData> 
    </EncryptedData> 
    <AnotherElements/> 
    </task> 
    <task id="2" > 
    <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#"> 
     <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" /> 
     <CipherData> 
     <CipherValue>+bv8xdFfDzXai3rB1D+c2voJ/mRkuQHJfV34iWB2wyezR3wxG5UnLmznq4i2emIh4Z+8KukZEKJmM8=</CipherValue> 
     </CipherData> 
    </EncryptedData> 
    <AnotherElements/> 
    </task> 
    ... 
<tasks> 

とバックアップファイル:

元でエラーが発生した場合には
<tasks> 
    <task id="1" > 
    <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#"> 
     <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" /> 
     <CipherData> 
     <CipherValue>+asd+c2voJ/sdf+8KukZEKJmM8=</CipherValue> 
     </CipherData> 
    </EncryptedData> 
    <AnotherElements/> 
    </task> 
    <task id="2" > 
    <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#"> 
     <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" /> 
     <CipherData> 
     <CipherValue>+asd+c2voJ/sdf+8KukZEKJmM8=</CipherValue> 
     </CipherData> 
    </EncryptedData> 
    <AnotherElements/> 
    </task> 
    ... 
<tasks> 

なぜなら、<EncryptedData>要素は元のファイルのバックアップファイルからすべての<EncryptedData>要素を置き換えたいからです。

これを行うにはどうすればよいですか?

答えて

1

EncryptedData要素を削除し、バックアップからのものを追加

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 


namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string origXml = @"c:\temp\test1.xml"; 
     const string backupXml = @"c:\temp\test2.xml"; 
     static void Main(string[] args) 
     { 
      XDocument origDoc = XDocument.Load(origXml); 

      XDocument backupDoc = XDocument.Load(backupXml); 

      var groups = (from orig in origDoc.Descendants("task") 
          join backup in backupDoc.Descendants("task") on (int)orig.Attribute("id") equals (int)backup.Attribute("id") 
          select new { orig = orig, backup = backup }).ToList(); 

      foreach (var group in groups) 
      { 
       group.orig.Descendants().Where(x => x.Name.LocalName == "CipherValue").FirstOrDefault().Value = 
        (string)group.backup.Descendants().Where(x => x.Name.LocalName == "CipherValue").FirstOrDefault(); 
      } 
     } 
    } 

} 
1

に参加LINQを使用してください。 (あなたの名前空間があなたの例で指定されたものであることを考慮して)

XDocument docOr = XDocument.Load(@"Path/To/Your/File/original.xml"); 
XDocument docBackup = XDocument.Load(@"Path/To/Your/File/backup.xml"); 

XNamespace ns = "http://www.w3.org/2001/04/xmlenc#"; 
foreach(XElement el in docOr.Root.Elements("task")) 
{ 
    el.Elements(ns+"EncryptedData").Remove(); 
    var NodesToAdd = docBackup 
      .Root 
      .Elements("task") 
      .First(x=>x.Attribute("id").Value==el.Attribute("id").Value) 
      .Elements(ns+"EncryptedData"); 
    foreach(XElement nta in NodesToAdd) 
    { 
     el.Add(nta); 
    } 
} 
docOr.Save(@"Path/To/Your/File/original.xml");