XmlSerializer不正确的格式结果

时间:2019-05-25 12:20:52

标签: c# .net xml

我想要的输出如下

<SOAP:Envelope xmlns:SOAP='http://schemas.xmlsoap.org/soap/envelope/' > 
<SOAP:Body UserGUID = '{redacted}' > 
<m:SaveOrder xmlns:m = 'http://www.e-courier.com/schemas/' > 
<Order UserID = '1' Notes = 'Signature Requiered' CustomerID = '3' > 
 </Order >  
 </m:SaveOrder > 
 </SOAP:Body >
 </SOAP:Envelope >

我得到的输出xml

 <?xml version="1.0"?>
<SOAP:Envelope xmlns:m="http://www.e-courier.com/schemas/" xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP:Body UserGUID="">
    <m:SaveOrder >
      <m:Order UserID="" Notes="" CustomerID="" />
    </m:SaveOrder>
  </SOAP:Body>
</SOAP:Envelope>

我的XML类代码:

[XmlRoot(ElementName="Order")]
public class Order {
    [XmlAttribute(AttributeName="UserID")]
    public string UserID { get; set; }
    [XmlAttribute(AttributeName="Notes")]
    public string Notes { get; set; }
    [XmlAttribute(AttributeName="CustomerID")]
    public string CustomerID { get; set; }
}

[XmlRoot(ElementName="SaveOrder", Namespace="http://www.e-courier.com/schemas/")]
public class SaveOrder {
    [XmlElement(ElementName="Order")]
    public Order Order { get; set; }
    [XmlAttribute(AttributeName="m", Namespace="http://www.w3.org/2000/xmlns/")]
    public string M { get; set; }
}

[XmlRoot(ElementName="Body", Namespace="http://schemas.xmlsoap.org/soap/envelope/")]
public class Body {
    [XmlElement(ElementName="SaveOrder", Namespace="http://www.e-courier.com/schemas/")]
    public SaveOrder SaveOrder { get; set; }
    [XmlAttribute(AttributeName="UserGUID")]
    public string UserGUID { get; set; }
}

[XmlRoot(ElementName="Envelope", Namespace="http://schemas.xmlsoap.org/soap/envelope/")]
public class Envelope {
    [XmlElement(ElementName="Body", Namespace="http://schemas.xmlsoap.org/soap/envelope/")]
    public Body Body { get; set; }
    [XmlAttribute(AttributeName="SOAP", Namespace="http://www.w3.org/2000/xmlns/")]
    public string SOAP { get; set; }
}

我在其中生成xml的代码

var SaveOrder = new ECSaveOrderRequest.Envelope
                {
                    Body = new ECSaveOrderRequest.Body
                    {
                        UserGUID = guid,
                        SaveOrder = new ECSaveOrderRequest.SaveOrder
                        {
                            Order = new ECSaveOrderRequest.Order
                            {
                                UserID = Uid,
                                Notes = "",
                                CustomerID=""                                
                            }
                        }

                     }
                    };
            var ns = new XmlSerializerNamespaces();
            ns.Add("SOAP", "http://schemas.xmlsoap.org/soap/envelope/");
            ns.Add("m", "http://www.e-courier.com/schemas/");

            var ser = new XmlSerializer(typeof(ECSaveOrderRequest.Envelope));

            using (var ms = new MemoryStream())
            {
                // write the DTO to the MemoryStream
                ser.Serialize(ms, SaveOrder, ns);

                using (var wc = new WebClient())
                {
                    wc.Encoding = System.Text.Encoding.UTF8;                       
                    ms.Position = 0;
                    StreamReader stream = new StreamReader(ms);
                    string requestString = stream.ReadToEnd();
                    var resp = wc.UploadData(ECUrl, ms.ToArray()); 
                }
            }

1 个答案:

答案 0 :(得分:1)

您需要明确清除SaveOrder上的xml名称空间。否则,序列化程序将默认为SaveOrder的xml名称空间。

您在这里:

using System;
using System.IO;
using System.Text;
using System.Xml.Serialization;

namespace ECSaveOrderRequest
{
    /*
     * <SOAP:Envelope xmlns:SOAP='http://schemas.xmlsoap.org/soap/envelope/' > 
          <SOAP:Body UserGUID = '{redacted}' > 
          <m:SaveOrder xmlns:m = 'http://www.e-courier.com/schemas/' > 
              <Order UserID = '1' Notes = 'Signature Requiered' CustomerID = '3' > 
              </Order >  
           </m:SaveOrder > 
         </SOAP:Body >
 </SOAP:Envelope >*/

    public class Order
    {
        [XmlAttribute(AttributeName = "UserID")]
        public string UserID { get; set; }

        [XmlAttribute(AttributeName = "Notes")]
        public string Notes { get; set; }

        [XmlAttribute(AttributeName = "CustomerID")]
        public string CustomerID { get; set; }
    }

    public class SaveOrder
    {
        [XmlElement(ElementName = "Order", Namespace = "")]
        public Order Order { get; set; }

    }

    public class Body
    {
        [XmlElement(ElementName = "SaveOrder", Namespace = "http://www.e-courier.com/schemas/")]
        public SaveOrder SaveOrder { get; set; }

        [XmlAttribute(AttributeName = "UserGUID")]
        public string UserGUID { get; set; }
    }

    [XmlRoot(ElementName = "Envelope", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
    public class Envelope
    {
        [XmlElement(ElementName = "Body", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
        public Body Body { get; set; }
        [XmlAttribute(AttributeName = "SOAP", Namespace = "http://www.w3.org/2000/xmlns/")]
        public string SOAP { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var SaveOrder = new ECSaveOrderRequest.Envelope
            {
                Body = new ECSaveOrderRequest.Body
                {
                    UserGUID = "{redacted}",
                    SaveOrder = new ECSaveOrderRequest.SaveOrder
                    {
                        Order = new ECSaveOrderRequest.Order
                        {
                            UserID = "1",
                            Notes = "Signature Requiered",
                            CustomerID = "3"
                        }
                    }

                }
            };
            var ns = new XmlSerializerNamespaces();
            ns.Add("SOAP", "http://schemas.xmlsoap.org/soap/envelope/");
            ns.Add("m", "http://www.e-courier.com/schemas/");

            var ser = new XmlSerializer(typeof(ECSaveOrderRequest.Envelope));

            var ms = new MemoryStream();
            // write the DTO to the MemoryStream
            ser.Serialize(ms, SaveOrder, ns);

            ms.Position = 0;

            var xml = Encoding.UTF8.GetString(ms.GetBuffer());
            Console.WriteLine(xml);
            Console.ReadKey();



        }
    }
}

输出

<?xml version="1.0"?>
<SOAP:Envelope xmlns:m="http://www.e-courier.com/schemas/" xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP:Body UserGUID="{redacted}">
    <m:SaveOrder>
      <Order UserID="1" Notes="Signature Requiered" CustomerID="3" />
    </m:SaveOrder>
  </SOAP:Body>
</SOAP:Envelope>

与以下相同的XML文档的序列化

    <SOAP:Envelope xmlns:SOAP='http://schemas.xmlsoap.org/soap/envelope/' > 
      <SOAP:Body UserGUID = '{redacted}' > 
        <m:SaveOrder xmlns:m = 'http://www.e-courier.com/schemas/' > 
          <Order UserID = '1' Notes = 'Signature Requiered' CustomerID = '3' > 
          </Order >  
        </m:SaveOrder > 
     </SOAP:Body>
   </SOAP:Envelope>