C# - 反序列化SOAP消息

时间:2016-07-13 09:09:57

标签: c# soap deserialization

我有这个SOAP消息,我需要序列化为C#对象:

<SOAP-ENV:Envelope xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema" xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAPSDK3="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAPSDK4:GetStoreInformationResponse xmlns:SOAPSDK4="http://www.example.com/message/">
      <StoreInformation>
        <StoreID>99612</StoreID>
        <BusinessDate>2016-01-28</BusinessDate>
        <Address type="Address-US">
           <Street>Via Roma 1</Street>
           <City>Milano</City>
        </Address>
      </StoreInformation>
    </SOAPSDK4:GetStoreInformationResponse>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我发现了很多序列化的例子,但我不能将这些应用到我的案例中。 有人可以帮帮我吗?

这是生成的c#类:

//------------------------------------------------------------------------------
// <auto-generated>
//     Il codice è stato generato da uno strumento.
//     Versione runtime:4.0.30319.42000
//
//     Le modifiche apportate a questo file possono provocare un comportamento non corretto e andranno perse se
//     il codice viene rigenerato.
// </auto-generated>
//------------------------------------------------------------------------------

using System.Xml.Serialization;

// 
// Codice sorgente generato automaticamente da xsd, versione=4.0.30319.33440.
// 


/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.example.com/message/")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.example.com/message/", IsNullable = false)]
public partial class GetStoreInformationResponse
{

    private GetStoreInformationResponseStoreInformation storeInformationField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public GetStoreInformationResponseStoreInformation StoreInformation
    {
        get
        {
            return this.storeInformationField;
        }
        set
        {
            this.storeInformationField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.example.com/message/")]
public partial class GetStoreInformationResponseStoreInformation
{

    private string storeIDField;

    private string businessDateField;

    private GetStoreInformationResponseStoreInformationAddress[] addressField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string StoreID
    {
        get
        {
            return this.storeIDField;
        }
        set
        {
            this.storeIDField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string BusinessDate
    {
        get
        {
            return this.businessDateField;
        }
        set
        {
            this.businessDateField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Address", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public GetStoreInformationResponseStoreInformationAddress[] Address
    {
        get
        {
            return this.addressField;
        }
        set
        {
            this.addressField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.example.com/message/")]
public partial class GetStoreInformationResponseStoreInformationAddress
{

    private string streetField;

    private string cityField;

    private string typeField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string Street
    {
        get
        {
            return this.streetField;
        }
        set
        {
            this.streetField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string City
    {
        get
        {
            return this.cityField;
        }
        set
        {
            this.cityField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string type
    {
        get
        {
            return this.typeField;
        }
        set
        {
            this.typeField = value;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您可以尝试使用xsd.exe工具生成C#类,并使用这段代码:

    /// <summary>
    /// Methode de deserialisation d'objets
    /// </summary>
    /// <param name="xmlObject">Document XML à désérialiser</param>
    /// <returns>Retourne l'objet chargé avec les données du document XML passé en paramètres</returns>
public static ObjectTypeT Deserialize(XmlDocument xmlObject)
{
    if (xmlObject == null)
        throw new NullXmlDocumentException();
    if (xmlObject.DocumentElement == null)
        throw new NullXmlDocumentElementException();

    using (XmlNodeReader reader = new XmlNodeReader(xmlObject.DocumentElement))
    {
        XmlSerializer serializer = new XmlSerializer(typeof(ObjectTypeT));
        return (ObjectTypeT)serializer.Deserialize(reader);
    }
}

生成您的对象。首先必须在XmlDocument中加载Xml。

答案 1 :(得分:0)

请尝试以下代码。我使用Load(字符串FILENAME),但您也可以使用Parse(字符串XML)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;


namespace ConsoleApplication2
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            var StoreInformation = doc.Descendants().Where(x => x.Name.LocalName == "StoreInformation").Select(y => new {
                storeID = (string)y.Elements().Where(z => z.Name.LocalName == "StoreID").FirstOrDefault(),
                businessDate = (DateTime)y.Elements().Where(z => z.Name.LocalName == "BusinessDate").FirstOrDefault(),
                type = (string)y.Elements().Where(z => z.Name.LocalName == "Address").Select(a => a.Attribute("type")).FirstOrDefault(),
                street = (string)y.Elements().Where(z => z.Name.LocalName == "Address").Select(a => a.Element(a.Name.Namespace + "Street")).FirstOrDefault(),
                city = (string)y.Elements().Where(z => z.Name.LocalName == "Address").Select(a => a.Element(a.Name.Namespace + "City")).FirstOrDefault()
            }).ToList();

        }
    }
 }