XML Deserializing "Element was not expected" error
c#, xml, xml-deserialization
Solution
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();
}
Problem
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!