c# - 在 C# 中将 Soap XML 解析为对象

标签 c# xml soap

我有以下 SOAP XML

string soap = "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:ns='http://schemas.abudhabi.ae/sso/2010/11'>" +
   "<soapenv:Header/>" +
   "<soapenv:Body>" +
      "<ns:GetUserProfileResponse>" +
         "<!--Optional:-->" +
         "<ns:userid>?</ns:userid>" +
         "<!--Optional:-->" +
         "<ns:firstNameAr>?</ns:firstNameAr>" +
         "<!--Optional:-->" +
         "<ns:firstNameEn>?</ns:firstNameEn>" +
         "<!--Optional:-->" +
         "<ns:middleNameAr>?</ns:middleNameAr>" +
         "<!--Optional:-->" +
         "<ns:middleNameEn>?</ns:middleNameEn>" +
         "<!--Optional:-->" +
         "<ns:thirdNameAr>?</ns:thirdNameAr>" +
         "<!--Optional:-->" +
         "<ns:thirdNameEn>?</ns:thirdNameEn>" +
         "<!--Optional:-->" +
         "<ns:fourthNameAr>?</ns:fourthNameAr>" +
         "<!--Optional:-->" +
         "<ns:fourthNameEn>?</ns:fourthNameEn>" +
         "<!--Optional:-->" +
         "<ns:familyNameAr>?</ns:familyNameAr>" +
         "<!--Optional:-->" +
         "<ns:familyNameEn>?</ns:familyNameEn>" +
         "<!--Optional:-->" +
         "<ns:authLevel>?</ns:authLevel>" +
         "<!--Optional:-->" +
         "<ns:dateOfBirth>?</ns:dateOfBirth>" +
         "<!--Optional:-->" +
         "<ns:gender>?</ns:gender>" +
         "<!--Optional:-->" +
         "<ns:nationalityCode>?</ns:nationalityCode>" +
         "<!--Optional:-->" +
         "<ns:idn>?</ns:idn>" +
         "<!--Optional:-->" +
         "<ns:modifyTimestamp>?</ns:modifyTimestamp>" +
         "<!--Optional:-->" +
         "<ns:prefComChannel>?</ns:prefComChannel>" +
         "<!--Optional:-->" +
         "<ns:secretQuestionAnswer>?</ns:secretQuestionAnswer>" +
         "<!--Optional:-->" +
         "<ns:secretQuestionId>?</ns:secretQuestionId>" +
         "<!--Optional:-->" +
         "<ns:address>" +
            "<!--Optional:-->" +
            "<ns:additionalAddressInfo>?</ns:additionalAddressInfo>" +
            "<!--Optional:-->" +
            "<ns:city>?</ns:city>" +
            "<!--Optional:-->" +
            "<ns:fax>?</ns:fax>" +
            "<!--Optional:-->" +
            "<ns:residenceCountry>?</ns:residenceCountry>" +
            "<!--Optional:-->" +
            "<ns:poBox>?</ns:poBox>" +
            "<!--Optional:-->" +
            "<ns:stateOrEmirate>?</ns:stateOrEmirate>" +
            "<!--Optional:-->" +
            "<ns:streetNameAndNumber>?</ns:streetNameAndNumber>" +
            "<!--Optional:-->" +
            "<ns:zipCode>?</ns:zipCode>" +
         "</ns:address>" +
         "<!--Optional:-->" +
         "<ns:contact>" +
            "<!--Optional:-->" +
            "<ns:email>?</ns:email>" +
            "<!--Optional:-->" +
            "<ns:mobilePhoneNumber>?</ns:mobilePhoneNumber>" +
            "<!--Optional:-->" +
            "<ns:website>?</ns:website>" +
            "<!--Optional:-->" +
            "<ns:workPhone>?</ns:workPhone>" +
         "</ns:contact>" +
      "</ns:GetUserProfileResponse>" +
   "</soapenv:Body>" +
"</soapenv:Envelope>";

我想让它解析或转换成下面的类

public class UserProfile
        {
            public string FirstNameAR { get; set; }

            public string FirstNameEN { get; set; }

            public string MiddleNameAR { get; set; }

            public string MiddleNameEN { get; set; }

            public string ThirdNameAR { get; set; }
            public string ThirdNameEN { get; set; }


            public string FourthNameAR { get; set; }

            public string FourthNameEN { get; set; }

            public string FamilyNameAR { get; set; }

            public string FamilyNameEN { get; set; }

            public Boolean AuthLevelSpecified { get; set; }

            public DateTime DateOfBirth { get; set; }
            public bool DateOfBirthSpecified { get; set; }


            public Boolean GenderTypeSpecified { get; set; }

            public string NationalityCode { get; set; }

            public string IDN { get; set; }

            public Boolean ModifyTimeStampSpecified { get; set; }
            public DateTime ModifyTimeStamp { get; set; }

            //  public PrefComChannelType PrefComChannelType { get; set; }
            public Boolean PrefComChannelTypeSpecified { get; set; }

            public string SecretQuestion { get; set; }

            public int SecretQuestionId { get; set; }

            public Boolean SecretQuestionSpecified { get; set; }
           }

我的代码是:

var Value = XDocument.Parse(soap);

XNamespace ns = @"http://schemas.xmlsoap.org/soap/envelope/";
 var unwrappedResponse = Value.Descendants((XNamespace)"http://schemas.xmlsoap.org/soap/envelope/" + "Body").First().FirstNode;

 XmlSerializer oXmlSerializer = new XmlSerializer(typeof(UserProfile));

 var responseObj = (UserProfile)oXmlSerializer.Deserialize(unwrappedResponse.CreateReader());

我正在关注这个问题 removing/extracting soap header and body from soap message 但是我收到错误消息。这段代码有什么问题吗?请帮忙

最佳答案

您需要使您的类名和属性名与 XML 中的名称相匹配——"GetUserProfileResponse" 和例如 "firstNameAr",请记住XML 序列化区分大小写。或者,您需要使用 attributes that control XML serialization将 XML 元素名称映射到您的类和属性名称。您还需要告诉 XmlSerializer 您的类已在 "http://schemas.abudhabi.ae/sso/2010/11" 命名空间中序列化。

对你有用的属性是:

  1. XmlRootAttribute - 允许您指定从给定类型创建的根元素的名称及其命名空间。

  2. XmlElementAttribute - 允许您指定正在序列化的类型成员的元素名称。

因此:

[XmlRoot("GetUserProfileResponse", Namespace = "http://schemas.abudhabi.ae/sso/2010/11")] // Serialized with root element name "GetUserProfileResponse" in namespace "http://schemas.abudhabi.ae/sso/2010/11".
public class UserProfile
{
    [XmlElement("firstNameAr")] // Serialized with element name "firstNameAr".
    public string FirstNameAR { get; set; }

    [XmlElement("firstNameEn")]
    public string FirstNameEN { get; set; }

    [XmlElement("middleNameAr")]
    public string MiddleNameAR { get; set; }

    [XmlElement("middleNameEn")]
    public string MiddleNameEN { get; set; }

    [XmlElement("thirdNameAr")]
    public string ThirdNameAR { get; set; }

    [XmlElement("thirdNameEn")]
    public string ThirdNameEN { get; set; }

    // Fix others similarly.
}

有关更多说明,请参阅 Controlling XML Serialization Using Attributes .

您还可以自动生成您的类(class)。参见 Generate C# class from XML获取说明。

关于c# - 在 C# 中将 Soap XML 解析为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32470975/

相关文章:

java - Android - 使用 Xml 布局自定义对话框

javascript - 导入 xml - 如何自动刷新 Google 表格

java - Android:在 Java 代码中从 strings.xml 中获取字符串

web-services - 换 SOAP :address location in generated wsdl to https on tomcat 6 axis2(1. 6.2)

python - 我如何检查 "sudo 0.4.1 jurko 5"及更新版本中生成/接收的 SUD?

c# - 使用 C# 的 64 位解决方案 ASP.NET 和一个使用 C++ 的 32 位项目

C# 文件路径重装

Java 和 SOAP 数据客户端请求为 UTC 时间并保存为 EST 时间

c# - System.String.Split(null) 不删除空格 (C#)

c# - 向 ProcessStartInfo 添加附加参数