C# XmlDocument Nodes
c#, xml, xmldocument
Solution
An XML document can only ever have one root node. Otherwise it's not well formed. You will need to create 2 xml documents and join them together if you need to send both at once.
Problem
I'm trying to access UPS tracking info and, as per their example, I need to build a request like so: ``` <?xml version="1.0" ?> <AccessRequest xml:lang='en-US'> <AccessLicenseNumber>YOURACCESSLICENSENUMBER</AccessLicenseNumber> <UserId>YOURUSERID</UserId> <Password>YOURPASSWORD</Password> </AccessRequest> <?xml version="1.0" ?> <TrackRequest> <Request> <TransactionReference> <CustomerContext>guidlikesubstance</CustomerContext> </TransactionReference> <RequestAction>Track</RequestAction> </Request> <TrackingNumber>1Z9999999999999999</TrackingNumber> </TrackRequest> ``` I'm having a problem creating this with 1 XmlDocument in C#. When I try to add the second: `<?xml version="1.0" ?> or the <TrackRequest>` it throws an error: System.InvalidOperationException: This document already has a 'DocumentElement' node. I'm guessing this is because a standard XmlDocument would only have 1 root node. Any ideas? Heres my code so far: ``` XmlDocument xmlDoc = new XmlDocument(); XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null); XmlElement rootNode = xmlDoc.CreateElement("AccessRequest"); rootNode.SetAttribute("xml:lang", "en-US"); xmlDoc.InsertBefore(xmlDeclaration, xmlDoc.DocumentElement); xmlDoc.AppendChild(rootNode); XmlElement licenseNode = xmlDoc.CreateElement("AccessLicenseNumber"); XmlElement userIDNode = xmlDoc.CreateElement("UserId"); XmlElement passwordNode = xmlDoc.CreateElement("Password"); XmlText licenseText = xmlDoc.CreateTextNode("mylicense"); XmlText userIDText = xmlDoc.CreateTextNode("myusername"); XmlText passwordText = xmlDoc.CreateTextNode("mypassword"); rootNode.AppendChild(licenseNode); rootNode.AppendChild(userIDNode); rootNode.AppendChild(passwordNode); licenseNode.AppendChild(licenseText); userIDNode.AppendChild(userIDText); passwordNode.AppendChild(passwordText); XmlElement rootNode2 = xmlDoc.CreateElement("TrackRequest"); xmlDoc.AppendChild(rootNode2); ```