Search code examples
c#xmlxmlroot

Adding a root xml element before another root C#


I have an xml document that follows:

-<Machines>


-<Machine>


-<InstallPath >

<Component "/>

<Component "/>

<Component "/>

<Component "/>

<Component "/>


</InstallPath>

</Machine>
</Machines>

I need to add a root Manifest element before Machines pragmatically using C#.

I tried the following code and I get an error saying that the document is not properly constructed.

Here is the code I am trying:

using (XmlReader reader = cmd.ExecuteXmlReader())
                    {
                        XDocument doc = XDocument.Load(reader);
                        doc.Root.AddBeforeSelf(new XElement("Manifest"));
                        string path = outputPath + "\\" + xmlFileName;

                        doc.Save(path);    
                    }

Solution

  • XML can only have one "root" element. So the structure you're wanting is not valid:

    <Manifest>
        ...
    </Manifest>
    <Machines>
        ...
    </Machines>
    

    If you want two sibling elements, they would need to be contained in another parent element.

    I want the Manifest element to surround the Machines element and the Machines element to contain the rest of the xml

    Then you need to create a new document:

    XDocument newDoc = new XDocument(new XElement("Manifest", doc.Root));
    

    This creates a new XDocument with a Manifest root tag, whose content is the root (and contents) of the original document.