-3

both I want to load in C# and compare entries and if they are not present add them, but certain exceptions should not be added.

I searched for similar problems but couldn't find a solution to my problem.

Modify XML existing content in C#

How to change XML Attribute

//NEW
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <file-manager>
    <part-programs>
      <mount-points>
        <mount-point alias="USB (E:)">E:\</mount-point>
      </mount-points>
    </part-programs>
    <cad-parts>
      <mount-points>
        <mount-point alias="Part Programs">C:\Messer\Partprogram</mount-point>
      </mount-points>
    </cad-parts>
</configuration>

//OLD
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <file-manager>
    <part-programs>
      <mount-points>
        <mount-point alias="Floppy (A:)">A:\</mount-point>
        <mount-point alias="USB (E:)">E:\</mount-point>
        <mount-point alias="USB (F:)">F:\</mount-point>
        <mount-point alias="Part Programs">C:\Messer\Partprogram</mount-point>
        <mount-point alias="Programas">C:\Messer\ProgramasMaq2</mount-point>
      </mount-points>
    </part-programs>
    <cad-parts>
      <mount-points>
        <mount-point alias="Floppy (A:)">A:\</mount-point>
        <mount-point alias="USB (E:)">E:\</mount-point>
        <mount-point alias="USB (F:)">F:\</mount-point>
        <mount-point alias="Part Programs">C:\Messer\Partprogram</mount-point>
      </mount-points>
    </cad-parts>
</configuration>

//Should be added to NEW one

      <mount-points>
        <mount-point alias="USB (F:)">F:\</mount-point>
        <mount-point alias="Part Programs">C:\Messer\Partprogram</mount-point>
        <mount-point alias="Programas">C:\Messer\ProgramasMaq2</mount-point>
      </mount-points>

    <cad-parts>
      <mount-points>
        <mount-point alias="USB (E:)">E:\</mount-point>
        <mount-point alias="USB (F:)">F:\</mount-point>
      </mount-points>
    </cad-parts>


//Should not be added

      <mount-points>
        <mount-point alias="Floppy (A:)">A:\</mount-point>
      </mount-points>

    <cad-parts>
      <mount-points>
        <mount-point alias="Floppy (A:)">A:\</mount-point>
      </mount-points>
    </cad-parts>
  • If I understand your question, you want to read and parse two XML files, look for entries in one that aren't in the other, add them and write it out again. That gives you several well defined steps, each of which is easily searchable. Try writing some code, and if you get stuck, show us what you have and explain clearly why it doesn't do what you expect. Then we can give more specific guidance. As your question stands, it doesn't show enough effort for people to answer. – Avrohom Yisroel Sep 02 '19 at 12:23

1 Answers1

0

Using a Join and a Left Outer Join will work

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 NEW_FILENAME = @"c:\temp\test.xml";
        const string OLD_FILENAME = @"c:\temp\test1.xml";
        static void Main(string[] args)
        {
            XDocument newDoc = XDocument.Load(NEW_FILENAME);
            XDocument oldDoc = XDocument.Load(OLD_FILENAME);

            var query = (from oD in oldDoc.Descendants("file-manager").Elements()
                         join nD in newDoc.Descendants("file-manager").Elements() on oD.Name.LocalName equals nD.Name.LocalName
                         select new { name =  oD.Name.LocalName, oldDoc = oD, newDoc = nD })
                         .ToList();

            foreach (var part in query)
            {
                //left outer join
                var q = (from oldPart in part.oldDoc.Descendants("mount-point")
                         join newPart in part.newDoc.Descendants("mount-point") on (string)oldPart.Attribute("alias") equals (string)newPart.Attribute("alias") into ps
                         from newPart in ps.DefaultIfEmpty()
                         select new { newPart = newPart, oldPart = oldPart })
                        .ToList();

                XElement newMountPoint = part.newDoc.Descendants("mount-points").FirstOrDefault(); 

                foreach (var point in q)
                {
                    if (point.newPart == null)
                    {
                        newMountPoint.Add(point.oldPart);
                    }
                }
            }

        }
    }
}
jdweng
  • 33,250
  • 2
  • 15
  • 20