我有以下 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"
命名空间中序列化。
对你有用的属性是:
XmlRootAttribute
- 允许您指定从给定类型创建的根元素的名称及其命名空间。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/