自动创建的用于xml反序列化的C#类不起作用
我正在努力为这个xml创建反序列化类:
John Johnos Some Street 1 24 success
我试图使用自动创建的代码(在VisualStudio 12中:编辑 – >选择性粘贴 – >将XML粘贴为类):
/// [System.SerializableAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "https://schemas.xmlsoap.org/soap/envelope/")] [System.Xml.Serialization.XmlRootAttribute(Namespace = "https://schemas.xmlsoap.org/soap/envelope/", IsNullable = false)] public partial class Envelope { private EnvelopeBody bodyField; private string encodingStyleField; /// public EnvelopeBody Body { get { return this.bodyField; } set { this.bodyField = value; } } /// [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified)] public string encodingStyle { get { return this.encodingStyleField; } set { this.encodingStyleField = value; } } } /// [System.SerializableAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "https://schemas.xmlsoap.org/soap/envelope/")] public partial class EnvelopeBody { private Response responseField; /// [System.Xml.Serialization.XmlElementAttribute(Namespace = "")] public Response Response { get { return this.responseField; } set { this.responseField = value; } } } /// [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; /// public ResponseRecords Records { get { return this.recordsField; } set { this.recordsField = value; } } /// public ResponseStatus status { get { return this.statusField; } set { this.statusField = value; } } } /// [System.SerializableAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] public partial class ResponseRecords { private ResponseRecordsItem itemField; private string arrayTypeField; /// public ResponseRecordsItem item { get { return this.itemField; } set { this.itemField = value; } } /// [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "https://schemas.xmlsoap.org/soap/encoding/")] public string arrayType { get { return this.arrayTypeField; } set { this.arrayTypeField = value; } } } /// [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; /// public string person { get { return this.personField; } set { this.personField = value; } } /// public string address { get { return this.addressField; } set { this.addressField = value; } } /// public byte age { get { return this.ageField; } set { this.ageField = value; } } } /// [System.SerializableAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] public partial class ResponseStatus { private ResponseStatusItem itemField; private string arrayTypeField; /// public ResponseStatusItem item { get { return this.itemField; } set { this.itemField = value; } } /// [System.Xml.Serialization.XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "https://schemas.xmlsoap.org/soap/encoding/")] public string arrayType { get { return this.arrayTypeField; } set { this.arrayTypeField = value; } } } /// [System.SerializableAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] public partial class ResponseStatusItem { private string statusField; private object messageField; /// public string status { get { return this.statusField; } set { this.statusField = value; } } /// 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='https://schemas.xmlsoap.org/soap/encoding/', at .
你能不能帮我改进这个xml的反序列化类?
我尝试了很多东西并最终弄明白了。 您发布的Xml无效,因为xsi:type在反序列化中不起作用。
有效的XML应如下所示:
-
John Johnos Some Street 1 24 -
success
代码应该如下所示:
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); }
Autogenerate类将来自:
-
John Johnos Some Street 1 24 -
success
希望这很清楚。 不知道如何从Envelope中删除类型,这可能不是你想要的解决方案。
我用来从Envelope获取东西的方法是XDocument.Descendants(elemmentName)
,它返回该名称的元素或List元素,然后你可以填充对象。 它更多的工作,但我认为它比转换xml反序列化更好。
为什么不为整个模式生成序列化库?
-
从邮件中的URL下载XSD架构文件并将其保存在某处
https://schemas.xmlsoap.org/soap/encoding/
-
打开Visual Studio命令提示符并输入以下命令
xsd / classes SoapEncoding.xsd
-
输出将是一个名为
SoapEncoding.cs
的文件。 - 将此文件导入项目并尝试再次反序列化该消息。
如果一切顺利,这一切都应该有效。
上述就是C#学习教程:自动创建的用于xml反序列化的C#类不起作用分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1016307.html