Error forming XML for a SOAP request [duplicate] - c#

I have to construct an XML document which has a SOAP envelope like so:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
Thought that SOAP-ENV is also a XElement, so tried like this:
XNamespace soap = "http://schemas.xmlsoap.org/soap/envelope/";
XElement soapEnvelope = new XElement(soap + "SOAP-ENV:Envelope",
new XAttribute(XNamespace.Xmlns + "xmlns:SOAP-ENV", soap.NamespaceName),
new XElement("SOAP-ENV:Body"));
gives this error:
The ':' character, hexadecimal value 0x3A, cannot be included in a
name.
Any clues?
Thanks in advance.

Try this
XNamespace soap = "http://schemas.xmlsoap.org/soap/envelope/";
XElement element = new XElement(soap + "Envelope",
new XAttribute(XNamespace.Xmlns + "SOAP-ENV", soap),
new XElement(soap + "Body"));

Related

XDocument Error Name cannot begin with the '<' character, hexadecimal value 0x3C

I am trying to create xml file using XDcoument, but I am getting following error
Name cannot begin with the '<' character, hexadecimal value 0x3C
here is my code
XDocument d = new XDocument(
new XElement("<S:Envelope xmlns:S='http://schemas.xmlsoap.org/soap/envelope/'>",
new XElement("<S:Header xmlns:wsse='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>",
new XElement("<ns13:ACASecurityHeader xmlns='urn:us:gov:treasury:irs:ext:aca:air:7.0' xmlns:ns10='urn:us:gov:treasury:irs:msg:acauibusinessheader' xmlns:ns11='http://www.w3.org/2000/09/xmldsig#' xmlns:ns12='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' xmlns:ns13='urn:us:gov:treasury:irs:msg:acasecurityheader' xmlns:ns2='urn:us:gov:treasury:irs:common' xmlns:ns3='urn:us:gov:treasury:irs:msg:form1094-1095Btransmitterupstreammessage' xmlns:ns4='urn:us:gov:treasury:irs:msg:form1094-1095Ctransmitterupstreammessage' xmlns:ns5='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd' xmlns:ns6='urn:us:gov:treasury:irs:msg:form1094-1095BCtransmittermessage' xmlns:ns7='urn:us:gov:treasury:irs:msg:form1094-1095BCtransmitterreqmessage' xmlns:ns8='urn:us:gov:treasury:irs:msg:irsacabulkrequesttransmitter' xmlns:ns9='urn:us:gov:treasury:irs:msg:acabusinessheader'>"),
new XElement("Author", "Moreno, Jordao")
),
new XElement("Book",
new XElement("Title", "Midieval Tools and Implements"),
new XElement("Author", "Gazit, Inbar")
)
),
new XComment("This is another comment."));
Can someone please help me on this?
here is sample XML file which I want to generate using XDocument
There is a much simpler way to do this rather than crafting the XML document by hand via XDocument, though I have an explanation and example below if you want to do it that way.
First, the simple way - create the XML as a string, and pass that string to XDocument.Parse, like this:
string xmlString = #"<S:Envelope xmlns:S=""http://schemas.xmlsoap.org/soap/envelope/""><S:Header xmlns:wsse=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd""><ns13:ACASecurityHeader xmlns:ns10=""urn:us:gov:treasury:irs:msg:acauibusinessheader"" xmlns:ns11=""http://www.w3.org/2000/09/xmldsig#"" xmlns:ns12=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"" xmlns:ns13=""urn:us:gov:treasury:irs:msg:acasecurityheader"" xmlns:ns2=""urn:us:gov:treasury:irs:common"" xmlns:ns3=""urn:us:gov:treasury:irs:msg:form1094-1095Btransmitterupstreammessage"" xmlns:ns4=""urn:us:gov:treasury:irs:msg:form1094-1095Ctransmitterupstreammessage"" xmlns:ns5=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"" xmlns:ns6=""urn:us:gov:treasury:irs:msg:form1094-1095BCtransmittermessage"" xmlns:ns7=""urn:us:gov:treasury:irs:msg:form1094-1095BCtransmitterreqmessage"" xmlns:ns8=""urn:us:gov:treasury:irs:msg:irsacabulkrequesttransmitter"" xmlns:ns9=""urn:us:gov:treasury:irs:msg:acabusinessheader""><Author>Moreno, Jordao</Author><Book><Title>Midieval Tools and Implement</Title><Author>Gazit, Inbar</Author></Book></ns13:ACASecurityHeader><!--This is another comment--></S:Header></S:Envelope>";
XDocument xDoc2 = XDocument.Parse(xmlString);
xDoc2 will contain the XML you wish to send.
If you wish to do it the long way, then there are a couple of issues with your posted code.
First, you're not correctly handling the namespaces (the xmlns: attributes). Secondly, you're including the < and > in the call to XElement, and you don't need to do that - the method takes care of those two symbols.
What you need to do is to set up the namespaces, then add them to the appropriate elements as well as creating the attributes for them.
The sample code doesn't match the posted snippet, so I worked off your sample code to show you how to go about crafting the XML by hand.
XNamespace sNS = XNamespace.Get("http://schemas.xmlsoap.org/soap/envelope/");
XNamespace wsseNS = XNamespace.Get("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
XNamespace xmlnsNS = XNamespace.Get("urn:us:gov:treasury:irs:ext:aca:air:7.0");
XNamespace ns10NS = XNamespace.Get("urn:us:gov:treasury:irs:msg:acauibusinessheader");
XNamespace ns11NS = XNamespace.Get("http://www.w3.org/2000/09/xmldsig#");
XNamespace ns12NS = XNamespace.Get("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
XNamespace ns13NS = XNamespace.Get("urn:us:gov:treasury:irs:msg:acasecurityheader");
XNamespace ns2NS = XNamespace.Get("xmlns: ns2 = 'urn:us:gov:treasury:irs:common");
XNamespace ns3NS = XNamespace.Get("urn:us:gov:treasury:irs:msg:form1094-1095Btransmitterupstreammessage");
XNamespace ns4NS = XNamespace.Get("urn:us:gov:treasury:irs:msg:form1094-1095Ctransmitterupstreammessage");
XNamespace ns5NS = XNamespace.Get("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
XNamespace ns6NS = XNamespace.Get("urn:us:gov:treasury:irs:msg:form1094-1095BCtransmittermessage");
XNamespace ns7NS = XNamespace.Get("urn:us:gov:treasury:irs:msg:form1094-1095BCtransmitterreqmessage");
XNamespace ns8NS = XNamespace.Get("urn:us:gov:treasury:irs:msg:irsacabulkrequesttransmitter");
XNamespace ns9NS = XNamespace.Get("urn:us:gov:treasury:irs:msg:acabusinessheader");
XDocument xDoc = new XDocument(new XElement(sNS + "Envelope", new XAttribute(XNamespace.Xmlns + "S", sNS),
new XElement(sNS + "Header", new XAttribute(XNamespace.Xmlns + "wsse", wsseNS),
new XElement(ns13NS + "ACASecurityHeader", new XAttribute(XNamespace.Xmlns + "ns10", ns10NS),
new XAttribute(XNamespace.Xmlns + "ns11", ns11NS),
new XAttribute(XNamespace.Xmlns + "ns12", ns12NS),
new XAttribute(XNamespace.Xmlns + "ns13", ns13NS),
new XAttribute(XNamespace.Xmlns + "ns2", ns2NS),
new XAttribute(XNamespace.Xmlns + "ns3", ns3NS),
new XAttribute(XNamespace.Xmlns + "ns4", ns4NS),
new XAttribute(XNamespace.Xmlns + "ns5", ns5NS),
new XAttribute(XNamespace.Xmlns + "ns6", ns6NS),
new XAttribute(XNamespace.Xmlns + "ns7", ns7NS),
new XAttribute(XNamespace.Xmlns + "ns8", ns8NS),
new XAttribute(XNamespace.Xmlns + "ns9", ns9NS
new XAttribute("xmlns", xmlnsNS),
new XElement("Author", "Moreno, Jordao"),
new XElement("Book",
new XElement("Title", "Midieval Tools and Implement"),
new XElement("Author", "Gazit, Inbar"))
),
new XComment("This is another comment")
))
);
The first thing the above code does is sets up all the namespaces via XNamespace.
Next, the XML Document is constructed. The individual elements are created via XElement, with the various namespaces prefixed (i.e., new XElement(sNS + "Envelope",, and the other namespaces added via XAttribute.
Nesting can get tricky, so you have to be very careful doing it this way. The above code will produce the following XML:
<?xml version="1.0"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<ns13:ACASecurityHeader xmlns="urn:us:gov:treasury:irs:ext:aca:air:7.0"
xmlns:ns9="urn:us:gov:treasury:irs:msg:acabusinessheader"
xmlns:ns8="urn:us:gov:treasury:irs:msg:irsacabulkrequesttransmitter"
xmlns:ns7="urn:us:gov:treasury:irs:msg:form1094-1095BCtransmitterreqmessage"
xmlns:ns6="urn:us:gov:treasury:irs:msg:form1094-1095BCtransmittermessage"
xmlns:ns5="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:ns4="urn:us:gov:treasury:irs:msg:form1094-1095Ctransmitterupstreammessage"
xmlns:ns3="urn:us:gov:treasury:irs:msg:form1094-1095Btransmitterupstreammessage" xmlns:ns2="urn:us:gov:treasury:irs:common"
xmlns:ns13="urn:us:gov:treasury:irs:msg:acasecurityheader"
xmlns:ns12="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:ns11="http://www.w3.org/2000/09/xmldsig#"
xmlns:ns10="urn:us:gov:treasury:irs:msg:acauibusinessheader">
<Author>Moreno, Jordao</Author>
<Book>
<Title>Midieval Tools and Implement</Title>
<Author>Gazit, Inbar</Author>
</Book>
</ns13:ACASecurityHeader>
<!--This is another comment-->
</S:Header>
</S:Envelope>
What you're doing is a really hard way to do this. There is a much easier way.
You have the Xsd specifications from them, you can use the xsd command in the Visual Studio command line to generate C# objects that match the requirements automatically during serialization.
For the IRS ACA schemas, get all the XSD files into the same directory. Then in a sibling directory to the one you created, place the Common folder.
Then, in the command line navigate to the directory you created and put all the xsd files and run this command:
xsd /c IRS-EXT-ACA-AIR-7.0.xsd IRS-ACABulkRequestTransmitterMessage.xsd IRS-Form1094-1095CTransmitterUpstreamMessage.xsd IRS-CAC.xsd IRS-WSTimeStampElementMessage.xsd IRS-WSTimeStampElementMessage.xsd
You'll end up with a C# file that has almost 200 objects in it including all the enums and such necessary for generating data compliant with their specifications.

I can't get <pmlcore:Sensor with XElement

I'm developing an ASP.NET MVC application with .NET Framework 4.5.1 that returns XML generated from database data.
I want to obtain this:
<?xml version="1.0" encoding="utf-8"?>
<pmlcore:Sensor [ Ommitted for brevety ] ">
But I get this:
<?xml version="1.0" encoding="utf-8"?>
<Sensor [ Ommitted for brevety ] xmlns="pmlcore">
Reading all the answers found in Stackoverflow, I changed my code to use XNamespace:
XNamespace ns = "http://www.w3.org/2001/XMLSchema-instance";
XDeclaration dec = new XDeclaration("1.0", "utf-8", null);
XNamespace pmlcore = "pmlcore";
XNamespace pmluid = "pmluid";
root = new XElement(pmlcore + "Sensor"
, new XAttribute(XNamespace.Xmlns + "pmluid",
"urn:autoid:specification:universal:Identifier:xml:schema:1")
, new XAttribute(XNamespace.Xmlns + "xsi", ns)
, new XAttribute(XNamespace.Xmlns + "pmlcore",
"urn:autoid:specification:interchange:PMLCore:xml:schema:1")
, new XAttribute(ns + "noNamespaceSchemaLocation",
"urn:autoid:specification:interchange:PMLCore:xml:schema:1 ./PML/SchemaFiles/Interchange/PMLCore.xsd")
How can I obtain <pmlcore:Sensor this?
If I use this code:
root = new XElement("pmlcore:Sensor"
I get this error:
The ':' character, hexadecimal value 0x3A, cannot be included in a
name
The problem is that you're adding the wrong namespace... you're trying to use the alias for it, instead of the namespace URI. Here's a concrete example that works:
using System;
using System.Xml.Linq;
class Program
{
static void Main(string[] args)
{
XNamespace pmlcore = "urn:autoid:specification:interchange:PMLCore:xml:schema:1";
XNamespace pmluid = "urn:autoid:specification:universal:Identifier:xml:schema:1";
var root = new XElement(pmlcore + "Sensor",
new XAttribute(XNamespace.Xmlns + "pmluid", pmluid.NamespaceName),
new XAttribute(XNamespace.Xmlns + "pmlcore", pmlcore.NamespaceName));
Console.WriteLine(root);
}
}
Output (reformatted):
<pmlcore:Sensor
xmlns:pmluid="urn:autoid:specification:universal:Identifier:xml:schema:1"
xmlns:pmlcore="urn:autoid:specification:interchange:PMLCore:xml:schema:1" />

Constructing a SOAP envelope using LINQ to XML

I have to construct an XML document which has a SOAP envelope like so:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
Thought that SOAP-ENV is also a XElement, so tried like this:
XNamespace soap = "http://schemas.xmlsoap.org/soap/envelope/";
XElement soapEnvelope = new XElement(soap + "SOAP-ENV:Envelope",
new XAttribute(XNamespace.Xmlns + "xmlns:SOAP-ENV", soap.NamespaceName),
new XElement("SOAP-ENV:Body"));
gives this error:
The ':' character, hexadecimal value 0x3A, cannot be included in a
name.
Any clues?
Thanks in advance.
Try this
XNamespace soap = "http://schemas.xmlsoap.org/soap/envelope/";
XElement element = new XElement(soap + "Envelope",
new XAttribute(XNamespace.Xmlns + "SOAP-ENV", soap),
new XElement(soap + "Body"));

Trouble with namespaces using Linq to XML to create response xml

I'm new to L2XML and not altogether an expert at XML so it isn't surprising I'm having a little trouble. In my first step I'm declaring a relatively simple XDocument object to create a XML method result.
Here is a sample of the expected XML.
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<soap:Body>
<TXLife xmlns="http://ACORD.org/Standards/Life/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ACORD.org/Standards/Life/2 TXLife2.28enum.XSD">
<UserAuthResponse>
<TransResult>
<ResultCode tc="1">Success</ResultCode>
</TransResult>
<SvrDate>2010-12-02</SvrDate>
<SvrTime>14:40:50-06:00</SvrTime>
</UserAuthResponse>
<TXLifeResponse>
<TransRefGUID>V7504892456123812</TransRefGUID>
<TransType tc="121">General Requirement Order Request</TransType>
<TransExeDate>2010-12-02</TransExeDate>
<TransExeTime>14:40:50-06:00</TransExeTime>
<TransMode tc="2">Original</TransMode>
<TestIndicator tc="1">Yes</TestIndicator>
<TransResult>
<ResultCode tc="1">Success</ResultCode>
</TransResult>
<OLifE>
<SourceInfo>
<CreationDate>2010-12-02</CreationDate>
<CreationTime>14:40:50-06:00</CreationTime>
<SourceInfoName>External Vendor Name</SourceInfoName>
</SourceInfo>
</OLifE>
</TXLifeResponse>
</TXLife>
</soap:Body>
</soap:Envelope>
Here is the code I'm using to try to create something matching the above:
public string SubmitOrder121(string xmlIn)
{
string resultText = "SUCCESS"; //Hard coded for now. Needs to be set based on result of call to CrossBow.
string resultCode = "1"; //Same comment as above.
string date = DateTime.Today.ToShortDateString();
string time = DateTime.Now.ToShortTimeString();
string transRefGUID = "V7504892456123812"; //Hard coded for now. Get from xmlIn;
string transModeText = "Original"; //Don't know what this is for or where to get it if there are other possibilities
string transModeCode = "2"; //Same as above comment
string testIndicatorText = "True"; //Get from config file
string testIndicatorCode = "1"; //Get from config file
string companyName = "External Vendor Name"; //Get from config file
XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
XNamespace soap = "http://www.w3.org/2001/12/soap-envelope";
XNamespace xmlns = "http://ACORD.org/Standards/Life/2";
XDocument xdoc = new XDocument(
new XDeclaration("1.0", "utf-8", ""),
new XElement(soap + "Envelope",
new XAttribute(XNamespace.Xmlns + "wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"),
new XAttribute(XNamespace.Xmlns + "wsa", "http://schemas.xmlsoap.org/ws/2004/03/addressing"),
new XAttribute(XNamespace.Xmlns + "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"),
new XAttribute(XNamespace.Xmlns + "soap", "http://schemas.xmlsoap.org/soap/envelope/"),
new XElement(soap + "Body",
new XElement(xmlns + "TXLife",
new XAttribute(xsi + "schemaLocation", "http://ACORD.org/Standards"),
new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
new XElement("UserAuthResponse",
new XElement("TransResult",
new XElement("ResultCode", resultText,
new XAttribute("tc", resultCode)
)
),
new XElement("SvrDate", date),
new XElement("SvrTime", time)
),
new XElement("TXLifeResponse",
new XElement("TransRefGUID", transRefGUID),
new XElement("TransType", "General Requiremeent Order Request",
new XAttribute("tc", "121")
),
new XElement("TransExeDate", date), //Get from crossbow result
new XElement("TransExeTime", time), //Get from crossbow result
new XElement("TransMode", transModeText,
new XAttribute("tc", transModeCode)
),
new XElement("TestIndicator", testIndicatorText,
new XAttribute("tc", testIndicatorCode)
),
new XElement("TransResult",
new XElement("ResultCode", resultText,
new XAttribute("tc", resultCode)
)
),
new XElement("OLife",
new XElement("SourceInfo",
new XElement("CreationDate", date),
new XElement("CreationTime", time),
new XElement("SourceInfoName", companyName)
)
)
)
)
)
)
);
return xdoc.ToString();
}
Now, given the little I've been able to understand so far, the above should give me what I want but it doesn't - exactly. It gives me this:
<Envelope xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://www.w3.org/2001/12/soap-envelope">
<Body>
<TXLife xsi:schemaLocation="http://ACORD.org/Standards" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://ACORD.org/Standards/Life/2">
<UserAuthResponse xmlns="">
<TransResult>
<ResultCode tc="1">SUCCESS</ResultCode>
</TransResult>
<SvrDate>6/14/2013</SvrDate>
<SvrTime>1:57 PM</SvrTime>
</UserAuthResponse>
<TXLifeResponse xmlns="">
<TransRefGUID>V7504892456123812</TransRefGUID>
<TransType tc="121">General Requiremeent Order Request</TransType>
<TransExeDate>6/14/2013</TransExeDate>
<TransExeTime>1:57 PM</TransExeTime>
<TransMode tc="2">Original</TransMode>
<TestIndicator tc="1">True</TestIndicator>
<TransResult>
<ResultCode tc="1">SUCCESS</ResultCode>
</TransResult>
<OLife>
<SourceInfo>
<CreationDate>6/14/2013</CreationDate>
<CreationTime>1:57 PM</CreationTime>
<SourceInfoName>The Company Name</SourceInfoName>
</SourceInfo>
</OLife>
</TXLifeResponse>
</TXLife>
</Body>
</Envelope>
Ignore the date and time formats. I know they don't match but that is something I will concern myself with later, just as I will the hardcoded values. I'm more concerned with the XML format, particularly with the following:
Why isn't the XDeclaration appearing in the XML result?
On the Soap envelope and body, why isn't the soap prefix appearing?
How do I suppress the xmlns attribute on the and TXLifeResponse> tags?
I've already seen references in answers to other similar questions referring to this link:
http://msdn.microsoft.com/en-us/library/bb387042.aspx
but that wasn't much help to me.
The ToString() method never emits an XML declaration.
The reason why is a different story, but check with xdoc.Save("sample.xml"); that writes the declaration.
At the line XNamespace soap = "http://www.w3.org/2001/12/soap-envelope"; you probably have a typo, change it to http://schemas.xmlsoap.org/soap/envelope/
You have to specify default namespace for all the children of the TXLife element, like this:
new XElement(xmlns + "UserAuthResponse",
new XElement(xmlns + "TransResult",
new XElement(xmlns + "ResultCode", resultText,
new XAttribute("tc", resultCode)
Hope this helps

Build SOAP envelope with XDocument instead of string

currently I have this code to build a soap envelope:
"<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<soap:Envelope " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
"xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
"<soap:Body> " +
"<ABRSearchByABN xmlns=\"http://abr.business.gov.au/ABRXMLSearch/\"> " +
"<searchString>" + searchValue + "</searchString>" +
"<includeHistoricalDetails>" + history + "</includeHistoricalDetails>" +
"<authenticationGuid>" + guid + "</authenticationGuid>" +
"</ABRSearchByABN>" +
"</soap:Body>" +
"</soap:Envelope>";
I am trying to create an XML document instead but I am not sure on how to go on with the namespaces.
Code that obiously doesn't work:
XNamespace soap = "http://schemas.xmlsoap.org/soap/envelope/";
XNamespace xmlns = "http://abr.business.gov.au/ABRXMLSearch/";
XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
XNamespace xsd = "http://www.w3.org/2001/XMLSchema";
XDocument xd = new XDocument(
new XDeclaration("1.0","utf-8",""),
new XElement("soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"",
new XElement("soap:Body",
new XElement("ABRSearchByABN xmlns=\"http://abr.business.gov.au/ABRXMLSearch/\"",
new XElement("searchString", searchValue),
new XElement("includeHistoricalDetails", history),
new XElement("authenticationGuid", guid)))));
How can I complete this?
Thanks in advance.
You could use the XmlDocument class and continue to append children.
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.AppendChild(xmlDoc.CreateNode(XmlNodeType.Element, "soap", "Envelope", "http://www.w3.org/2001/XMLSchema-instance"));
Also, assuming you already have your xml stored as a string, an even simpler although potentially less manageable solution would be to simply declare a new XmlDocument and load the string to it.
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(yourString);
This covers everything in pretty good detail: http://msdn.microsoft.com/en-us/library/bb387042.aspx
You can't think of a DOM API (like L2XML or XmlDocument) the same way as you think of your string-concatenating code. When working with L2XML, namespace declarations and attributes are "things" that need to be handled explicitly, not just extra characters that go between angle brackets. Consequently, the XElement constructor isn't as simple as "here is the string I want to go between the angle brackets." Instead, you need to use an alternate XElement constructor that handles namespaces.

Categories