我知道之前已经问过这个问题,但是我检查了其他线程,没有人对我有所帮助。 我试图将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(); }更多推荐
发布评论