草庐IT

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

coder 2024-06-25 原文

我有以下 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/

有关c# - 在 C# 中将 Soap XML 解析为对象的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  5. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  6. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  7. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  8. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  9. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  10. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

随机推荐