我正在努力为此xml创建反序列化类:
<?xml version="1.0" encoding="ISO-8859-1"?> <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:stn="urn:response"> <SOAP-ENV:Body> <Response> <Records xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="stn:Record[1]"> <item xsi:type="stn:Record"> <person xsi:type="xsd:string">John Johnos</person> <address xsi:type="xsd:string">Some Street 1</address> <age xsi:type="xsd:string">24</age> </item> </Records> <status xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="stn:status[1]"> <item xsi:type="stn:status"> <status xsi:type="xsd:string">success</status> <message xsi:type="xsd:string"/> </item> </status> </Response> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
我试图使用自动创建的代码(在VisualStudio 12:编辑 – >粘贴特殊 – >将XML粘贴为类):
/// <remarks/> [System.SerializableAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true,Namespace = "http://schemas.xmlsoap.org/soap/envelope/")] [System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.xmlsoap.org/soap/envelope/",IsNullable = false)] public partial class Envelope { private EnvelopeBody bodyField; private string encodingStyleField; /// <remarks/> public EnvelopeBody Body { get { return this.bodyField; } set { this.bodyField = value; } } /// <remarks/> [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified)] public string encodingStyle { get { return this.encodingStyleField; } set { this.encodingStyleField = value; } } } /// <remarks/> [System.SerializableAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true,Namespace = "http://schemas.xmlsoap.org/soap/envelope/")] public partial class EnvelopeBody { private Response responseField; /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(Namespace = "")] public Response Response { get { return this.responseField; } set { this.responseField = value; } } } /// <remarks/> [System.SerializableAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] [System.Xml.Serialization.XmlRootAttribute(Namespace = "",IsNullable = false)] public partial class Response { private ResponseRecords recordsField; private ResponseStatus statusField; /// <remarks/> public ResponseRecords Records { get { return this.recordsField; } set { this.recordsField = value; } } /// <remarks/> public ResponseStatus status { get { return this.statusField; } set { this.statusField = value; } } } /// <remarks/> [System.SerializableAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] public partial class ResponseRecords { private ResponseRecordsItem itemField; private string arrayTypeField; /// <remarks/> public ResponseRecordsItem item { get { return this.itemField; } set { this.itemField = value; } } /// <remarks/> [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified,Namespace = "http://schemas.xmlsoap.org/soap/encoding/")] public string arrayType { get { return this.arrayTypeField; } set { this.arrayTypeField = value; } } } /// <remarks/> [System.SerializableAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] public partial class ResponseRecordsItem { private string personField; private string addressField; private byte ageField; /// <remarks/> public string person { get { return this.personField; } set { this.personField = value; } } /// <remarks/> public string address { get { return this.addressField; } set { this.addressField = value; } } /// <remarks/> public byte age { get { return this.ageField; } set { this.ageField = value; } } } /// <remarks/> [System.SerializableAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] public partial class ResponseStatus { private ResponseStatusItem itemField; private string arrayTypeField; /// <remarks/> public ResponseStatusItem item { get { return this.itemField; } set { this.itemField = value; } } /// <remarks/> [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified,Namespace = "http://schemas.xmlsoap.org/soap/encoding/")] public string arrayType { get { return this.arrayTypeField; } set { this.arrayTypeField = value; } } } /// <remarks/> [System.SerializableAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] public partial class ResponseStatusItem { private string statusField; private object messageField; /// <remarks/> public string status { get { return this.statusField; } set { this.statusField = value; } } /// <remarks/> public object message { get { return this.messageField; } set { this.messageField = value; } } }
我试图在XMLSerializer的帮助下反序列化:
var serializer = new XmlSerializer(typeof(Envelope)); var reader = new StringReader(response); var flResponse = (Envelope)serializer.Deserialize(reader);
我得到的错误消息:
Message=The specified type was not recognized: name='Array',namespace='http://schemas.xmlsoap.org/soap/encoding/',at <Records xmlns=''>.
你能请我帮忙为这个xml挑选反序列化类吗?
我尝试了很多东西,然后弄清楚了.您发布的Xml无效,因为xsi:type在反序列化中不起作用.
原文链接:https://www.f2er.com/xml/292960.html有效的XML应该如下所示:
<?xml version="1.0" encoding="ISO-8859-1"?> <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:stn="urn:response"> <SOAP-ENV:Body> <Response> <Records> <item> <person >John Johnos</person> <address >Some Street 1</address> <age >24</age> </item> </Records> <status> <item> <status >success</status> <message/> </item> </status> </Response> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
代码应该看起来像:
XDocument xml = XDocument.Parse(xmlInput); XmlSerializer serializer = new XmlSerializer(typeof(Response)); using (StringReader stream = new StringReader(items[0].ToString())) { var output = (Response)serializer.Deserialize(stream); }
<Response> <Records xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <item> <person>John Johnos</person> <address >Some Street 1</address> <age>24</age> </item> </Records> <status xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <item > <status >success</status> <message /> </item> </status> </Response>
希望这很清楚.不知道如何摆脱Envelope的类型,所以这可能不是你想要的解决方案.
用于从Envelope获取东西的方法是XDocument.Descendants(elemmentName),它返回数组或该名称的元素列表,然后可以填充对象.它更多的工作,但我认为它比将XML转换为反序列化更好.