我正在使用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>
元素。
最好的方法是什么?
答案 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");