0

xml1:

<filters>
    <folder>
        <text>
          FOLDER1
        </text>
        <filter>
          <text>
            FILTER1
          </text>
          <value>X</value>
        </filter>
        <filter>
          <text>
            FILTER2
          </text>
          <value>X</value>
        </filter>
    </folder>
</filters>

xml2:

<filters>
    <folder>
        <text>
          FOLDER2
        </text>
        <filter>
          <text>
            FILTER3
          </text>
          <value>X</value>
        </filter>
        <filter>
          <text>
            FILTER4
          </text>
          <value>X</value>
        </filter>
    </folder>
</filters>

xml3:

<filters>
    <folder>
        <text>
          FOLDER1
        </text>
        <filter>
          <text>
            FILTER5
          </text>
          <value>X</value>
        </filter>
        <filter>
          <text>
            FILTER6
          </text>
          <value>X</value>
        </filter>
    </folder>
</filters>

and I want merge like this:

<filters>
    <folder>
        <text>
          FOLDER1
        </text>
        <filter>
          <text>
            FILTER1
          </text>
          <value>X</value>
        </filter>
        <filter>
          <text>
            FILTER2
          </text>
          <value>X</value>
        </filter>
        
        <filter>
          <text>
            FILTER5
          </text>
          <value>X</value>
        </filter>
        <filter>
          <text>
            FILTER6
          </text>
          <value>X</value>
        </filter>
    </folder>
    
    <folder>
        <text>
          FOLDER2
        </text>
        <filter>
          <text>
            FILTER3
          </text>
          <value>X</value>
        </filter>
        <filter>
          <text>
            FILTER4
          </text>
          <value>X</value>
        </filter>
    </folder>
</filters>

I want to use 2 specific xml nodes. I must add new "folder" sometimes but if I have same "folder" (according to folder text data), I want to add into this "folder". Like xml3. Is it possible? How can I make it? Does it have a way? I merged these xml files like but like a has a new "folder". I can't merge as I wanted.

ozknhasan
  • 3
  • 3
  • https://stackoverflow.com/questions/982597/what-is-the-fastest-way-to-combine-two-xml-files-into-one#:~:text=The%20easiest%20way%20to%20do,Concat%20depending%20on%20your%20needs.&text=Pass%20in%20the%20names%20of,document%2C%20e.g.%20an%20empty%20one. – Buddhika Chathuranga Aug 25 '20 at 19:31
  • I read this. So write like that: var xml1 = XDocument.Load(xml1); var xml2 = XDocument.Load(xml2); xml1.Descendants("folder").LastOrDefault().AddAfterSelf(xml2.Descendants("folder")); xml1.Save(xml1); But when i have same "folder", write as difference nodes. I dont want it. – ozknhasan Aug 25 '20 at 19:34

1 Answers1

0

Try following xml linq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FOLDER = @"c:\temp\test\";
        static void Main(string[] args)
        {
            //merged elements
            XElement newFilters = new XElement("filters");

            foreach (string filename in Directory.GetFiles(FOLDER, "*.xml"))
            {
                XDocument doc = XDocument.Load(filename);
                XElement filters = doc.Descendants("filters").FirstOrDefault();
                string folderName = ((string)filters.Element("folder").Element("text")).Trim();

                XElement newFolder = newFilters.Elements("folder").Where(x => ((string)x.Element("text")).Trim() == folderName).FirstOrDefault();
                if (newFolder == null)
                {
                    newFilters.Add(filters.Elements());
                }
                else
                {
                    List<XElement> xFilters = filters.Descendants("filter").ToList(); 
                    newFolder.Add(xFilters);
                }
            }
        }
    }
}
jdweng
  • 33,250
  • 2
  • 15
  • 20