我知道以前有人问过这个问题,但我检查了其他线程,没有任何帮助。我正在尝试将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文档中。
任何帮助都将是伟大的,谢谢!
我将xml放入文件"test.xml"中,然后运行xsd-test.xml。这导致了"test.xsd"one_answers"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();
}
也许在这两种情况下名称空间需要相同。被拒绝的XML片段末尾缺少"%ws"。