sanjeev
sanjeev

Reputation: 1407

Append XMLDocument to other

I have following two xml strings

   <?xml version="1.0"?>
  <AccessRequest xml:lang='en-US'>
    <AccessLicenseNumber>YOURACCESSLICENSENUMBER</AccessLicenseNumber>
    <UserId>YOURUSERID</UserId>
    <Password>YOURPASSWORD</Password>
  </AccessRequest>

and

<?xml version="1.0" ?>
<RatingServiceSelectionRequest>                            
<PickupType>
  <Code>01</Code>
</PickupType>
<Shipment>
  <Description>Rate </Description>
  <Shipper>
    <Address>
      <PostalCode>originzip</PostalCode>
    </Address>
</Shipper>
<ShipTo>
  <Address>
    <PostalCode>destinationzip</PostalCode>
    <CountryCode>countrycode</CountryCode>
  </Address>
</ShipTo>
<Service>
  <Code>11</Code>
</Service>
<Package>
  <PackagingType>
    <Code>02</Code>
    <Description>Package</Description>
  </PackagingType>
  <Description>Rate Shopping</Description>
  <PackageWeight>
    <Weight>weight</Weight>
  </PackageWeight>
</Package>
<ShipmentServiceOptions/>
</Shipment>
</RatingServiceSelectionRequest>

I want to append second xml string to first one. I tried writing both XmlDocuments to a XmlWriter. But it throws exception "Cannot write XML declaration. XML declaration can be only at the beginning of the document."

Stream stm = req.GetRequestStream();
XmlDocument doc1 = new XmlDocument();
XmlDocument doc2 = new XmlDocument();


doc1.LoadXml(xmlData1);
doc2.LoadXml(xmlData2);

XmlWriterSettings xws = new XmlWriterSettings();
xws.ConformanceLevel = ConformanceLevel.Fragment;

using (XmlWriter xw = XmlWriter.Create(stm, xws))
{
  doc1.WriteTo(xw);
  doc2.WriteTo(xw);
}

How can I append it as is? Please help

Upvotes: 1

Views: 120

Answers (2)

Larry
Larry

Reputation: 18031

I had this problem in the past. The two lines of code below did the job:

var MyDoc = XDocument.Load("File1.xml");
MyDoc.Root.Add(XDocument.Load("File2.xml").Root.Elements());

If you already have strings ready, then please use the Parse function instead of Load.

Please notice I am using the System.Xml.Linq that uses XDocument instead of XmlDocument class.

EDIT

As I understood, you need both documents to be concatenated as is. The problem is that it will eventually leads to an invalid XML document for two reasons :

  • the document will contain two root nodes: AccessRequest and RatingServiceSelectionRequest. A valid XML document contains only one root node.
  • There must be only one <?xml version="1.0" ?> XML declaration at the beginning of a document.

If the UPS api your are using is fed with an invalid XML, you unfortunately can not use XML objects. Therefore you will have to use a simple string concatenation to achieve what you want:

var xml = xmlData1 + xmlData2;

Upvotes: 1

Software Engineer
Software Engineer

Reputation: 3956

Remove <?xml version="1.0" ?> from second xml string before appending it to first xml string.

Upvotes: 1

Related Questions