我需要使用c#格式创建xml。
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<AddressLine1 xmlns="">50 W TOWN ST</AddressLine1>
<AddressLine2 xmlns="">STE 400</AddressLine2>
<City xmlns="">COLUMBUS</City>
<State xmlns="">OH</State>
<Zip xmlns="">43215</Zip>
<Zip4 xmlns=""/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
下面是我创建xml的c#代码,如上所述
XmlDocument doc = new XmlDocument();
XmlNode docNode = doc.CreateElement("SOAP-ENV:Envelope");
XmlAttribute typeAttr = doc.CreateAttribute("xmlns:SOAP-ENV");
typeAttr.Value = "http://schemas.xmlsoap.org/soap/envelope/";
docNode.Attributes.Append(typeAttr);
doc.AppendChild(docNode);
XmlNode AddressRequestBody = doc.CreateElement("SOAP-ENV:Body");
docNode.AppendChild(AddressRequestBody);
........
........
XmlNode Zip4Node = doc.CreateElement("Zip4");
typeAttr = doc.CreateAttribute("xmlns");
typeAttr.Value = "";
Zip4Node.Attributes.Append(typeAttr);
Zip4Node.AppendChild(doc.CreateTextNode(""));
AddressRequestBody.AppendChild(Zip4Node);
使用上面的代码,我正在使用xml,如下所示。在Envelop和body标签中缺少 SOAP-ENV: 。任何想法如何获得SOAP-ENV:在Envelop和body标签中。我是xml的新手,不确定如何获得。
<Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<Body>
<AddressLine1 xmlns="">Add1</AddressLine1>
<AddressLine2 xmlns="">Add2</AddressLine2>
<City xmlns="">City1</City>
<State xmlns="">state1</State>
<Zip xmlns="">zip1</Zip>
<Zip4 xmlns=""></Zip4>
</Body>
</Envelope>
答案 0 :(得分:0)
您可以使用XML Document Object Model创建所需的XML,如下所示:
var soapNs = @"http://schemas.xmlsoap.org/soap/envelope/";
var bodyNs = @"";
var doc = new XmlDocument();
var root = doc.AppendChild(doc.CreateElement("SOAP-ENV", "Envelope", soapNs));
var body = root.AppendChild(doc.CreateElement("SOAP-ENV", "Body", soapNs));
body.AppendChild(doc.CreateElement("", "AddressLine1", bodyNs)).InnerText = "50 W TOWN ST";
body.AppendChild(doc.CreateElement("", "AddressLine2", bodyNs)).InnerText = "STE 400";
body.AppendChild(doc.CreateElement("", "City", bodyNs)).InnerText = "COLUMBUS";
body.AppendChild(doc.CreateElement("", "State", bodyNs)).InnerText = "OH";
body.AppendChild(doc.CreateElement("", "Zip", bodyNs)).InnerText = "43215";
body.AppendChild(doc.CreateElement("", "Zip4", bodyNs)).InnerText = "";
使用此方法,生成以下XML:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<AddressLine1>50 W TOWN ST</AddressLine1>
<AddressLine2>STE 400</AddressLine2>
<City>COLUMBUS</City>
<State>OH</State>
<Zip>43215</Zip>
<Zip4></Zip4>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
注意:
格式良好的XML文档必须只有一个root element。在问题的初始版本中,您尝试直接将多个节点添加到XmlDocument doc
:
doc.AppendChild(docNode);
// Snip some code
doc.AppendChild(AddressRequestNode);
尝试执行此操作会导致抛出This document already has a 'DocumentElement' node.
异常。
您的XML文档包含两个名称空间中的元素:http://schemas.xmlsoap.org/soap/envelope/
和空名称空间。在这种情况下,最简单的方法是使用XmlDocument.CreateElement(string prefix, string localName, string namespaceURI)
API并始终显式指定名称空间URI,而不是简单地指定名称空间查找前缀并希望您已正确初始化相应的xmlns:
前缀值较早。
在示例XML中,Envelope
和Body
节点位于http://schemas.xmlsoap.org/soap/envelope/
名称空间中,而其子节点位于空名称空间中,这是我的示例代码中反映的内容。
XmlNode.AppendChild(XmlNode)
返回附加的子项,因此可以流畅的方式使用。
在示例XML中,最内层元素被明确指定为具有""
的默认命名空间:
<AddressLine1 xmlns="">50 W TOWN ST</AddressLine1>
实际上xmlns=""
是不必要的,因为在XML中没有在更高级别指定的默认命名空间。因此,以下内容在语义上是相同和充分的:
<AddressLine1>50 W TOWN ST</AddressLine1>
如果由于某种原因你必需拥有这个冗余的命名空间声明,你可以这样做:
var line1 = body.AppendChild(doc.CreateElement("", "AddressLine1", bodyNs));
line1.Attributes.Append(doc.CreateAttribute("xmlns")).Value = bodyNs;
line1.InnerText = "50 W TOWN ST";
结果是
<AddressLine1 xmlns="">50 W TOWN ST</AddressLine1>
XmlElement.InnerText
可用于设置没有子元素的元素的文本值。这比调用CreateTextNode()
然后将结果附加到DOM更简洁。
工作样本.Net小提琴here。