Search code examples
c#insertlinq-to-xmladditionxelement

Adding Elements to an XDocument c#


Hi there i am having troubles finding a solution merging 2 XML codes together.

Could someone please tell me how i can merge my initial Xdocument with INSERT below:

Any help is appreciated! Thank you

INITIAL XDOC:

        XDocument doc = new XDocument(
            new XDeclaration("1.0", "utf-8", "true"),
            new XElement(ns + "Root",
                new XAttribute("xmlns", "http://www.blabla.com"),
                new XElement(ns + "LEVEL1", "A"),
                new XElement(ns + "LEVEL1", "B"),
                new XElement(ns + "LEVEL1",
                    new XElement(ns + "LEVEL2", "A"),
                    new XElement(ns + "LEVEL2", "B"),
                    new XElement(ns + "LEVEL2", "C"),
                    new XElement(ns + "LEVEL2")),

                        <Insert Here>

                new XElement(ns + "LEVEL1", "D")));

INSERT:

       INSERT= new XElement(ns + "LEVEL3",
                   new XElement(ns + "LEVEL4", "A"),
                   new XElement(ns + "LEVEL4", "B"),
                   new XElement(ns + "LEVEL4", "C"),
                   new XElement(ns + "LEVEL4",
                       new XElement(ns + "LEVEL5", "A"),
                       new XElement(ns + "LEVEL5", "B"),
                       new XElement(ns + "LEVEL5", "C"),
                       new XElement(ns + "LEVEL5", "D")),
                   new XElement(ns + "LEVEL4", "E"));

Desired output:

 XDocument doc = new XDocument(
        new XDeclaration("1.0", "utf-8", "true"),
        new XElement(ns + "Root",
            new XAttribute("xmlns", "http://www.blabla.com"),
            new XElement(ns + "LEVEL1", "A"),
            new XElement(ns + "LEVEL1", "B"),
            new XElement(ns + "LEVEL1",
                new XElement(ns + "LEVEL2", "A"),
                new XElement(ns + "LEVEL2", "B"),
                new XElement(ns + "LEVEL2", "C"),
                new XElement(ns + "LEVEL2"
                    new XElement(ns + "LEVEL3",
                        new XElement(ns + "LEVEL4", "A"),
                        new XElement(ns + "LEVEL4", "B"),
                        new XElement(ns + "LEVEL4", "C"),
                        new XElement(ns + "LEVEL4",
                            new XElement(ns + "LEVEL5", "A"),
                            new XElement(ns + "LEVEL5", "B"),
                            new XElement(ns + "LEVEL5", "C"),
                            new XElement(ns + "LEVEL5", "D")),
                        new XElement(ns + "LEVEL4", "E"))
            new XElement(ns + "LEVEL1", "D"))));

Solution

  • If you just want to append to the last instance of the element named "LEVEL2" you could use the code:

    XNamespace ns = "http://www.w3.org/2001/XMLSchema-instance";
    XDocument doc = new XDocument(
    new XDeclaration("1.0", "utf-8", "true"),
    new XElement(ns + "Root",
        new XAttribute("xmlns", ns),
        new XElement(ns + "LEVEL1", "A"),
        new XElement(ns + "LEVEL1", "B"),
        new XElement(ns + "LEVEL1",
            new XElement(ns + "LEVEL2", "A"),
            new XElement(ns + "LEVEL2", "B"),
            new XElement(ns + "LEVEL2", "C"),
            new XElement(ns + "LEVEL2")),                    
    
        new XElement(ns + "LEVEL1", "D")));
    
    XElement childElement = new XElement(ns + "LEVEL3",
    new XElement(ns + "LEVEL4", "A"),
    new XElement(ns + "LEVEL4", "B"),
    new XElement(ns + "LEVEL4", "C"),
    new XElement(ns + "LEVEL4",
        new XElement(ns + "LEVEL5", "A"),
        new XElement(ns + "LEVEL5", "B"),
        new XElement(ns + "LEVEL5", "C"),
        new XElement(ns + "LEVEL5", "D")),
    new XElement(ns + "LEVEL4", "E"));
    
    XElement level2Node = doc.Descendants(ns+"LEVEL2").Last();
    level2Node.Add(childElement);