CSharpBeginner
CSharpBeginner

Reputation: 611

Xml Elements Override

I'm Using C#.

I have 2 xml files thats look same execpt specific element value:

The original file:

<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>

And backup file:

<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>

In case of error in the original file because the <EncryptedData>element i want to replace all <EncryptedData> element from the backup file in the original file.

What is the best way to do that?

Upvotes: 0

Views: 97

Answers (2)

Magnetron
Magnetron

Reputation: 8573

Remove the EncryptedData elements and then add the ones from the backup. (Considering that your namespace is the one specified in your examples)

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

Upvotes: 1

jdweng
jdweng

Reputation: 34429

Use a 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();  
            }
        }
    }

}

Upvotes: 1

Related Questions