XML反序列化“未预期元素”错误(XML Deserializing “Element was not expected” error)

编程入门 行业动态 更新时间:2024-10-24 04:36:57
XML反序列化“未预期元素”错误(XML Deserializing “Element was not expected” error)

我知道之前已经问过这个问题,但是我检查了其他线程,没有人对我有所帮助。 我试图将xml反序列化为对象并收到错误:

"<doPublish xmlns='http://usdoj.gov/leisp/lexs/publishdiscover/3.1'> was not expected."

我的XML看起来像:

<lexspd:doPublish xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://usdoj.gov/leisp/lexs/publishdiscover/3.1 ../xsd/lexs/publish-discover/3.1/publish-discover.xsd" xmlns:lexspd="http://usdoj.gov/leisp/lexs/publishdiscover/3.1" xmlns:lexs="http://usdoj.gov/leisp/lexs/3.1"> <lexs:PublishMessageContainer> <lexs:PublishMessage> <lexs:PDMessageMetadata> </lexs:PDMessageMetadata> </lexs:PublishMessage> </lexs:PublishMessageContainer> </lexspd:doPublish>

我用来反序列化的代码如下:

XmlSerializer xs = new XmlSerializer(typeof(PublishMessageType)); Encoding encode = new UTF8Encoding(); PDWebService lexpdServiceProxy = new PDWebService(); lexpdServiceProxy.Url = "http://59.60.72.12/"; String pdMessageXml = File.ReadAllText(fileName); DoPublishType doPublishType = new DoPublishType(); MemoryStream publishMsgMemStream = new MemoryStream(encode.GetBytes(pdMessageXml)); doPublishType.PublishMessageContainer = new PublishMessageType[1]; doPublishType.PublishMessageContainer[0] = (PublishMessageType)xs.Deserialize(publishMsgMemStream);

我试图反序列化的对象看起来像:(缩短版本)

/// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Web.Services.WebServiceBindingAttribute(Name = "PDWebServiceSoapBinding", Namespace = "http://usdoj.gov/leisp/lexs/publishdiscover/3.1/ws")] [System.Xml.Serialization.XmlIncludeAttribute(typeof(SRMessageType))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(AugmentationType))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(PayloadObjectReferenceType))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(ComplexObjectType))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(MetadataType))] public partial class PDWebService : System.Web.Services.Protocols.SoapHttpClientProtocol { private System.Threading.SendOrPostCallback doPublishOperationCompleted; /// <remarks/> public PDWebService() { this.Url = "http://localhost:9080/PDWebService/services/PDWebServiceBean"; } /// <remarks/> public event doPublishCompletedEventHandler doPublishCompleted; /// <remarks/> [System.Web.Services.Protocols.SoapDocumentMethodAttribute("urn:#doPublish", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)] [return: System.Xml.Serialization.XmlElementAttribute("doPublishReponse", Namespace = "http://usdoj.gov/leisp/lexs/publishdiscover/3.1/ws")] public doPublishReponse doPublish([System.Xml.Serialization.XmlElementAttribute("doPublish", Namespace = "http://usdoj.gov/leisp/lexs/publishdiscover/3.1")] DoPublishType doPublish1) { object[] results = this.Invoke("doPublish", new object[] { doPublish1}); return ((doPublishReponse)(results[0])); } /// <remarks/> public System.IAsyncResult BegindoPublish(DoPublishType doPublish1, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("doPublish", new object[] { doPublish1}, callback, asyncState); } /// <remarks/> public doPublishReponse EnddoPublish(System.IAsyncResult asyncResult) { object[] results = this.EndInvoke(asyncResult); return ((doPublishReponse)(results[0])); } /// <remarks/> public void doPublishAsync(DoPublishType doPublish1) { this.doPublishAsync(doPublish1, null); } /// <remarks/> public void doPublishAsync(DoPublishType doPublish1, object userState) { if ((this.doPublishOperationCompleted == null)) { this.doPublishOperationCompleted = new System.Threading.SendOrPostCallback(this.OndoPublishOperationCompleted); } this.InvokeAsync("doPublish", new object[] { doPublish1}, this.doPublishOperationCompleted, userState); } private void OndoPublishOperationCompleted(object arg) { if ((this.doPublishCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.doPublishCompleted(this, new doPublishCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } /// <remarks/> public new void CancelAsync(object userState) { base.CancelAsync(userState); } } /// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://usdoj.gov/leisp/lexs/publishdiscover/3.1/ws")] public partial class doPublishReponse { private string responseStausField; private doPublishReponseErrorDetails errorDetailsField; /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public string responseStaus { get { return this.responseStausField; } set { this.responseStausField = value; } } /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public doPublishReponseErrorDetails errorDetails { get { return this.errorDetailsField; } set { this.errorDetailsField = value; } } }

我试过添加:

[System.Xml.Serialization.XmlRoot("doPublish", Namespace = "http://usdoj.gov/leisp/lexs/publishdiscover/3.1", IsNullable = true)]

在课堂上我也试图反序列化,没有运气。 我也尝试将XmlSerializer对象更改为:

XmlRootAttribute xRoot = new XmlRootAttribute(); xRoot.ElementName = "doPublish"; xRoot.Namespace = "http://usdoj.gov/leisp/lexs/publishdiscover/3.1"; xRoot.IsNullable = true; XmlSerializer xs = new XmlSerializer(typeof(PublishMessageType), xRoot);

这可以工作,但反序列化对象中的每个类型都将返回null,即使它们都填充在xml文档中。

任何帮助都会很棒,谢谢!

I know this has been asked before, but I checked the other threads and none were of help to me. I am trying to deserialize an xml to an object and am getting the error:

"<doPublish xmlns='http://usdoj.gov/leisp/lexs/publishdiscover/3.1'> was not expected."

My XML looks like:

<lexspd:doPublish xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://usdoj.gov/leisp/lexs/publishdiscover/3.1 ../xsd/lexs/publish-discover/3.1/publish-discover.xsd" xmlns:lexspd="http://usdoj.gov/leisp/lexs/publishdiscover/3.1" xmlns:lexs="http://usdoj.gov/leisp/lexs/3.1"> <lexs:PublishMessageContainer> <lexs:PublishMessage> <lexs:PDMessageMetadata> </lexs:PDMessageMetadata> </lexs:PublishMessage> </lexs:PublishMessageContainer> </lexspd:doPublish>

The code I am using to deserialize with looks like:

XmlSerializer xs = new XmlSerializer(typeof(PublishMessageType)); Encoding encode = new UTF8Encoding(); PDWebService lexpdServiceProxy = new PDWebService(); lexpdServiceProxy.Url = "http://59.60.72.12/"; String pdMessageXml = File.ReadAllText(fileName); DoPublishType doPublishType = new DoPublishType(); MemoryStream publishMsgMemStream = new MemoryStream(encode.GetBytes(pdMessageXml)); doPublishType.PublishMessageContainer = new PublishMessageType[1]; doPublishType.PublishMessageContainer[0] = (PublishMessageType)xs.Deserialize(publishMsgMemStream);

And the object I am trying to deserialize too looks like: (shortened version)

/// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Web.Services.WebServiceBindingAttribute(Name = "PDWebServiceSoapBinding", Namespace = "http://usdoj.gov/leisp/lexs/publishdiscover/3.1/ws")] [System.Xml.Serialization.XmlIncludeAttribute(typeof(SRMessageType))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(AugmentationType))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(PayloadObjectReferenceType))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(ComplexObjectType))] [System.Xml.Serialization.XmlIncludeAttribute(typeof(MetadataType))] public partial class PDWebService : System.Web.Services.Protocols.SoapHttpClientProtocol { private System.Threading.SendOrPostCallback doPublishOperationCompleted; /// <remarks/> public PDWebService() { this.Url = "http://localhost:9080/PDWebService/services/PDWebServiceBean"; } /// <remarks/> public event doPublishCompletedEventHandler doPublishCompleted; /// <remarks/> [System.Web.Services.Protocols.SoapDocumentMethodAttribute("urn:#doPublish", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)] [return: System.Xml.Serialization.XmlElementAttribute("doPublishReponse", Namespace = "http://usdoj.gov/leisp/lexs/publishdiscover/3.1/ws")] public doPublishReponse doPublish([System.Xml.Serialization.XmlElementAttribute("doPublish", Namespace = "http://usdoj.gov/leisp/lexs/publishdiscover/3.1")] DoPublishType doPublish1) { object[] results = this.Invoke("doPublish", new object[] { doPublish1}); return ((doPublishReponse)(results[0])); } /// <remarks/> public System.IAsyncResult BegindoPublish(DoPublishType doPublish1, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("doPublish", new object[] { doPublish1}, callback, asyncState); } /// <remarks/> public doPublishReponse EnddoPublish(System.IAsyncResult asyncResult) { object[] results = this.EndInvoke(asyncResult); return ((doPublishReponse)(results[0])); } /// <remarks/> public void doPublishAsync(DoPublishType doPublish1) { this.doPublishAsync(doPublish1, null); } /// <remarks/> public void doPublishAsync(DoPublishType doPublish1, object userState) { if ((this.doPublishOperationCompleted == null)) { this.doPublishOperationCompleted = new System.Threading.SendOrPostCallback(this.OndoPublishOperationCompleted); } this.InvokeAsync("doPublish", new object[] { doPublish1}, this.doPublishOperationCompleted, userState); } private void OndoPublishOperationCompleted(object arg) { if ((this.doPublishCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.doPublishCompleted(this, new doPublishCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } /// <remarks/> public new void CancelAsync(object userState) { base.CancelAsync(userState); } } /// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://usdoj.gov/leisp/lexs/publishdiscover/3.1/ws")] public partial class doPublishReponse { private string responseStausField; private doPublishReponseErrorDetails errorDetailsField; /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public string responseStaus { get { return this.responseStausField; } set { this.responseStausField = value; } } /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] public doPublishReponseErrorDetails errorDetails { get { return this.errorDetailsField; } set { this.errorDetailsField = value; } } }

I have tried adding:

[System.Xml.Serialization.XmlRoot("doPublish", Namespace = "http://usdoj.gov/leisp/lexs/publishdiscover/3.1", IsNullable = true)]

To the top of the class I am trying to deserialize too, with no luck. I have also tried changing the XmlSerializer object to:

XmlRootAttribute xRoot = new XmlRootAttribute(); xRoot.ElementName = "doPublish"; xRoot.Namespace = "http://usdoj.gov/leisp/lexs/publishdiscover/3.1"; xRoot.IsNullable = true; XmlSerializer xs = new XmlSerializer(typeof(PublishMessageType), xRoot);

This would work, but every type in the deserialized object would return null, even though they are all populated in the xml document.

Any help would be great, thanks!

最满意答案

我将您的xml放入文件'test.xml',然后运行xsd test.xml。 这导致'test.xsd'和'test_app1.xsd'。 我将test_app1.xsd中的架构元素添加到test.xsd,然后运行xsd.test.xsd / classes。

这导致:

/// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://usdoj.gov/leisp/lexs/3.1")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://usdoj.gov/leisp/lexs/3.1", IsNullable=false)] public partial class PublishMessageContainer { private PublishMessageContainerPublishMessage[] publishMessageField; /// <remarks/> [System.Xml.Serialization.XmlElementAttribute("PublishMessage")] public PublishMessageContainerPublishMessage[] PublishMessage { get { return this.publishMessageField; } set { this.publishMessageField = value; } } } /// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://usdoj.gov/leisp/lexs/3.1")] public partial class PublishMessageContainerPublishMessage { private string pDMessageMetadataField; /// <remarks/> public string PDMessageMetadata { get { return this.pDMessageMetadataField; } set { this.pDMessageMetadataField = value; } } } /// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://usdoj.gov/leisp/lexs/3.1")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://usdoj.gov/leisp/lexs/3.1", IsNullable=false)] public partial class doPublish { private PublishMessageContainer[] itemsField; /// <remarks/> [System.Xml.Serialization.XmlElementAttribute("PublishMessageContainer")] public PublishMessageContainer[] Items { get { return this.itemsField; } set { this.itemsField = value; } } }

现在在LINQPad中运行以下代码,工作正常。

using(var stream = File.Open(@"..path here..\test.xml", FileMode.Open)) { XmlRootAttribute xRoot = new XmlRootAttribute(); xRoot.ElementName = "doPublish"; xRoot.Namespace = "http://usdoj.gov/leisp/lexs/publishdiscover/3.1"; xRoot.IsNullable = true; var serializer = new XmlSerializer(typeof(doPublish), xRoot); var root = (doPublish)serializer.Deserialize(stream); root.Dump(); }

I put your xml into a file 'test.xml' and then ran xsd test.xml. This resulted in 'test.xsd' and 'test_app1.xsd'. I added the schema elements from test_app1.xsd to test.xsd and then ran xsd.test.xsd /classes.

This resulted in:

/// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://usdoj.gov/leisp/lexs/3.1")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://usdoj.gov/leisp/lexs/3.1", IsNullable=false)] public partial class PublishMessageContainer { private PublishMessageContainerPublishMessage[] publishMessageField; /// <remarks/> [System.Xml.Serialization.XmlElementAttribute("PublishMessage")] public PublishMessageContainerPublishMessage[] PublishMessage { get { return this.publishMessageField; } set { this.publishMessageField = value; } } } /// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://usdoj.gov/leisp/lexs/3.1")] public partial class PublishMessageContainerPublishMessage { private string pDMessageMetadataField; /// <remarks/> public string PDMessageMetadata { get { return this.pDMessageMetadataField; } set { this.pDMessageMetadataField = value; } } } /// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://usdoj.gov/leisp/lexs/3.1")] [System.Xml.Serialization.XmlRootAttribute(Namespace="http://usdoj.gov/leisp/lexs/3.1", IsNullable=false)] public partial class doPublish { private PublishMessageContainer[] itemsField; /// <remarks/> [System.Xml.Serialization.XmlElementAttribute("PublishMessageContainer")] public PublishMessageContainer[] Items { get { return this.itemsField; } set { this.itemsField = value; } } }

Now running the following code in LINQPad, works fine.

using(var stream = File.Open(@"..path here..\test.xml", FileMode.Open)) { XmlRootAttribute xRoot = new XmlRootAttribute(); xRoot.ElementName = "doPublish"; xRoot.Namespace = "http://usdoj.gov/leisp/lexs/publishdiscover/3.1"; xRoot.IsNullable = true; var serializer = new XmlSerializer(typeof(doPublish), xRoot); var root = (doPublish)serializer.Deserialize(stream); root.Dump(); }

更多推荐

本文发布于:2023-07-30 21:50:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1340330.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:元素   错误   序列化   XML   error

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!