2012-04-06 79 views
3

我知道这已被问过,但我检查了其他线程,没有任何帮助给我。我试图反序列化的XML对象,并正在错误: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文件内。

任何帮助将是伟大的,谢谢!

+0

你可以给你想要的类的名字(德)序列化?它是否发布了回复? 如果是这样,我没有看到 [System.Xml.Serialization.XmlInclude(typeof(doPublishReponse))]代理类中的任何位置 – jbl 2012-04-06 16:01:52

+0

该类的名称是PDWebService。我也推荐了doPublishResponse类。 – 2012-04-06 16:10:05

回答

5

我把你的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(); 
} 
+0

谢谢你的工作,但在我发布doPublish对象到Web服务后,Web服务返回“FAIL”,奇怪的是,说PublishMessageType为null。即使在Visual Studio调试模式下查看对象时,它也会被填充。代码最初是如何设置的,XmlSerializer将反序列化为一种类型的PublishMessageType。有关如何将其反序列化为一种PublishMessageType的想法? – 2012-04-12 19:33:28

+1

是否有公共URL,以便我可以添加服务引用? – Phil 2012-04-12 19:45:31

0

也许命名空间在两种情况下都需要相同。拒绝的XML片段最后缺少“/ ws”。

+0

我试图从PDWebService类中删除ws,它仍然给出了相同的错误。 – 2012-04-08 16:11:38

相关问题