使用以下格式的c#创建XML文件

时间:2018-05-16 21:25:11

标签: c# .net xml

我需要使用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>

1 个答案:

答案 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>

注意:

  1. 格式良好的XML文档必须只有一个root element。在问题的初始版本中,您尝试直接将多个节点添加到XmlDocument doc

    doc.AppendChild(docNode);
    // Snip some code  
    doc.AppendChild(AddressRequestNode);
    

    尝试执行此操作会导致抛出This document already has a 'DocumentElement' node.异常。

  2. 您的XML文档包含两个名称空间中的元素:http://schemas.xmlsoap.org/soap/envelope/和空名称空间。在这种情况下,最简单的方法是使用XmlDocument.CreateElement(string prefix, string localName, string namespaceURI) API并始终显式指定名称空间URI,而不是简单地指定名称空间查找前缀并希望您已正确初始化相应的xmlns:前缀值较早。

    在示例XML中,EnvelopeBody节点位于http://schemas.xmlsoap.org/soap/envelope/名称空间中,而其子节点位于空名称空间中,这是我的示例代码中反映的内容。

  3. XmlNode.AppendChild(XmlNode)返回附加的子项,因此可以流畅的方式使用。

  4. 在示例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>
    
  5. XmlElement.InnerText可用于设置没有子元素的元素的文本值。这比调用CreateTextNode()然后将结果附加到DOM更简洁。

  6. 工作样本.Net小提琴here