2015-09-09 3 views
4

У меня есть следующий SOAP XMLАнализировать мыло XML в объект в C#

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 Но я получаю error.Is там любая вещь wro ng с этим кодом. Пожалуйста, помогите

+2

Какая ошибка? –

+0

{" не ожидалось."} –

ответ

5

Вам нужно, чтобы ваши имена классов и имена свойств соответствовали именам в 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.

Вы также можете автоматически генерировать свои классы. Для получения информации см. Generate C# class from XML.

+0

Ты отличный человек. –