3

REST API を使用して httpclient でデータを取得しようとしましたが、解析の問題が発生しました {"行 1 の位置 95 でエラーが発生しました。ネームスペースから要素 'workflow' が必要です ' http://schemas.datacontract.org/2004/07/ '.. 名前が 'workflow'、名前空間が '' の 'Element' が見つかりました。"}

クライアントコードは

string baseUri = "/rest/workflows/";
            client = CreateClient(baseUri);

            HttpRequestMessage request = CreateRequest(baseUri);
            var task = client.SendAsync(request);
            HttpResponseMessage response = task.Result;
            response.EnsureSuccessStatusCode();

            response.Content.ReadAsAsync<collection>().ContinueWith(wf =>
                {
                    Console.WriteLine(wf.Result.workflow.Length);
                });

データクラス

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.w3.org/2005/Atom", IsNullable = false)]
public partial class collection
{

    private workflow[] workflowField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("workflow", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public workflow[] workflow
    {
        get
        {
            return this.workflowField;
        }
        set
        {
            this.workflowField = value;
        }
    }
}

応答xmlファイルはこの形式です

<collection xmlns:ns2="http://www.w3.org/2005/Atom">
    <workflow uuid="5ffbde8c-c430-4851-9c83-164c102a4d68">
        <name>Remove a Volume</name>
        <categories>
            <category>Decommissioning</category>
        </categories>
    </workflow>
  </collection>

response.Content.ReadAsStringAsync() を使用して文字列を取得し、それを xml ファイルに保存してから、それをコレクションに逆シリアル化し、成功できますが、serizliazer にデフォルトの名前空間が必要です

XmlSerializer serializer = new XmlSerializer(typeof(collection), "xmlns:ns2=\"http://www.w3.org/2005/Atom\"");
            c = serializer.Deserialize(stream) as collection;

誰もがこれを助けることができます

4

3 に答える 3

4

xsd.exe ツールから生成されたファイルに触れないでください。

by settingでデフォルトで使用されるXmlSerializer代わりにを使用することを明示的に設定するだけです。DataContractSerializerXmlMediaTypeFormatterUseXmlSerializer = true

したがって、次のような特定の型フォーマッタを作成する必要があります。

var formatters = new List<MediaTypeFormatter>() {
                new XmlMediaTypeFormatter(){ UseXmlSerializer = true } };

ReadAsAsyncメソッドのパラメーターとして使用します。

private async Task<T> ReadAsync<T>(HttpResponseMessage response)
=> await response.Content.ReadAsAsync<T>(formatters);
于 2018-04-20T17:58:57.853 に答える
3

名前空間が一致しません。xmlはアトム アドレスの名前空間エイリアス( ) を宣言しますが、コレクション要素の名前空間は、そのエイリアスを使用ns2しない (ではない) ため、まだ空です。xml が間違っているか、コードが間違っています。xml を変更できない場合は、名前空間を空の文字列に設定するだけです。C# が正しく、xml が間違っている場合は、エイリアスではなく名前空間にします。ns2:collection[XmlRoot(...)]

<collection xmlns="http://www.w3.org/2005/Atom">
    <workflow uuid="5ffbde8c-c430-4851-9c83-164c102a4d68">
        <name>Remove a Volume</name>
        <categories>
            <category>Decommissioning</category>
        </categories>
    </workflow>
  </collection>

または同じように:

<ns2:collection xmlns:ns2="http://www.w3.org/2005/Atom">
    <workflow uuid="5ffbde8c-c430-4851-9c83-164c102a4d68">
        <name>Remove a Volume</name>
        <categories>
            <category>Decommissioning</category>
        </categories>
    </workflow>
  </ns2:collection>
于 2013-04-12T10:33:19.910 に答える
2

Web API からデータを読み取るときに、まったく同じ問題が発生しました。私の問題を解決したのは、クライアントのクラスを [DataContract(Namespace="namespacefromyourwebapi")] 属性で装飾し、クラスの各プロパティを [DataMember] 属性で装飾することです。

于 2015-04-01T09:43:27.550 に答える