Xml元素覆盖

时间:2017-02-01 09:46:20

标签: c# xml

我正在使用C#。

我有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>元素。

最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

使用linq Join

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 :(得分: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");