3

私はこれが以前に尋ねられたことを知っています、しかし私は他のスレッドをチェックしました、そしてどれも私に助けになりませんでした。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);

これは機能しますが、逆シリアル化されたオブジェクトのすべてのタイプは、すべてxmlドキュメントに入力されていても、nullを返します。

どんな助けでも素晴らしいでしょう、ありがとう!

4

2 に答える 2

5

xmlをファイル「test.xml」に入れてから、xsdtest.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();
}
于 2012-04-08T17:22:16.210 に答える
0

おそらく、名前空間は両方の場合で同じである必要があります。拒否されたXMLの一部には、最後に「/ws」がありません。

于 2012-04-08T16:07:45.377 に答える