2012-04-06 10 views
3

これは以前に尋ねられたことは分かっていますが、他のスレッドをチェックしても何も役に立ちませんでした。私は、オブジェクトにXMLをデシリアライズしようとしていますし、エラーを取得しています: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); 

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

私のXMLは次のようになります

また、デシリアライズしようとしているオブジェクトは次のようになります。(短縮版)

/// <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)] 

、運で。これは動作しますが、非直列化されたオブジェクト内のすべての種類は、それらがすべてのXML文書に移入されているにもかかわらず、nullを返します

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); 

: は、私はまたにするXmlSerializerオブジェクトを変更しようとしています。

ご協力いただきありがとうございます!

+0

(de)シリアライズするクラスの名前を教えてください。それはdoPublishReponseですか? プロキシクラスのどこにでも [System.Xml.Serialization.XmlInclude(typeof(doPublishReponse))]がありません – jbl

+0

クラスの名前はPDWebServiceです。 doPublishResponseクラスも同様に追加します。 –

答えて

5

xmlを 'test.xml'ファイルに置き、xsd test.xmlを実行しました。 これは 'test.xsd'と 'test_app1.xsd'になりました。 test_app1.xsdからtest.xsdにスキーマ要素を追加してから、xsd.test.xsd/classesを実行しました。

これはの結果:

今LINQPadで次のコードを実行している
/// <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; 
     } 
    } 
} 

、正常に動作します。

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がtypeof PublishMessageTypeにdeserializeすることでした。 PublishMessageTypeの型にデシリアライズする方法を考えていますか? –

+1

サービス参照を追加できるように公開URLはありますか? – Phil

0

多分、両方の場合で名前空間が同じである必要があります。 XMLの拒否された部分には最後に "/ ws"がありません。

+0

PDWebServiceクラスからwsを削除しようとしましたが、それでも同じエラーが発生しました。 –

関連する問題