2017-02-01 231 views
0

我正在使用C#。Xml元素覆蓋

我有2個xml文件,這就是看相同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

使用LINQ加入

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

取出EncryptedData元素,然後從備份中添加的。 (考慮你的命名空間是你的例子中指定的名稱空間)

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");