0

SOAP 呼び出しを介して次の XML を取得しています。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
    <GetValueListForFieldResponse xmlns="http://URLHere/webservices/">
        <GetValueListForFieldResult>
            &amp;lt;SelectDef&amp;gt; &amp;lt;Id&amp;gt;1736&amp;lt;/Id&amp;gt; &amp;lt;SelectName&amp;gt;Values List&amp;lt;/SelectName&amp;gt; &amp;lt;GlobalFlag&amp;gt;False&amp;lt;/GlobalFlag&amp;gt; &amp;lt;Sort&amp;gt;1&amp;lt;/Sort&amp;gt; &amp;lt;SelectDefValues&amp;gt; &amp;lt;SelectDefValue&amp;gt; &amp;lt;guid&amp;gt;aaf6f3a7-6a74-4187-b4e7-3a9355b16796&amp;lt;/guid&amp;gt; &amp;lt;Id&amp;gt;14692&amp;lt;/Id&amp;gt; &amp;lt;Name&amp;gt;Open&amp;lt;/Name&amp;gt; &amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt; &amp;lt;Color&amp;gt;#000000&amp;lt;/Color&amp;gt; &amp;lt;DefaultFlag&amp;gt;False&amp;lt;/DefaultFlag&amp;gt; &amp;lt;SortOrder&amp;gt;1&amp;lt;/SortOrder&amp;gt; &amp;lt;select_id&amp;gt;1736&amp;lt;/select_id&amp;gt; &amp;lt;/SelectDefValue&amp;gt; &amp;lt;SelectDefValue&amp;gt; &amp;lt;guid&amp;gt;f5082b54-d799-4fdc-80c1-0e232b360057&amp;lt;/guid&amp;gt; &amp;lt;Id&amp;gt;14693&amp;lt;/Id&amp;gt; &amp;lt;Name&amp;gt;Closed&amp;lt;/Name&amp;gt; &amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt; &amp;lt;Color&amp;gt;#000000&amp;lt;/Color&amp;gt; &amp;lt;DefaultFlag&amp;gt;False&amp;lt;/DefaultFlag&amp;gt; &amp;lt;SortOrder&amp;gt;0&amp;lt;/SortOrder&amp;gt; &amp;lt;select_id&amp;gt;1736&amp;lt;/select_id&amp;gt; &amp;lt;/SelectDefValue&amp;gt; &amp;lt;SelectDefValue&amp;gt; &amp;lt;guid&amp;gt;94e29e78-2ab3-463f-bbb6-ab7f36003c7f&amp;lt;/guid&amp;gt; &amp;lt;Id&amp;gt;14780&amp;lt;/Id&amp;gt; &amp;lt;Name&amp;gt;Past Due&amp;lt;/Name&amp;gt; &amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt; &amp;lt;Color&amp;gt;#000000&amp;lt;/Color&amp;gt; &amp;lt;DefaultFlag&amp;gt;False&amp;lt;/DefaultFlag&amp;gt; &amp;lt;SortOrder&amp;gt;2&amp;lt;/SortOrder&amp;gt; &amp;lt;select_id&amp;gt;1736&amp;lt;/select_id&amp;gt; &amp;lt;/SelectDefValue&amp;gt; &amp;lt;/SelectDefValues&amp;gt; &amp;lt;/SelectDef&amp;gt;
        </GetValueListForFieldResult>
    </GetValueListForFieldResponse>
</soap:Body>

データを解析できるように、GetValueForFieldResult ノードのデータを実際の XML に変換する方法はありますか?

以下は、SOAP 呼び出しを行い、XML を保存する方法です。私は C# を学んでいます。以下が完全に混乱している場合は、お詫び申し上げます。

HttpWebRequest reqVl = (HttpWebRequest)WebRequest.Create(serverURL + "/ws/Field.asmx");
reqVl.Headers.Add("SOAPAction", "http://URL/webservices/GetValueListForField");
reqVl.ContentType = "text/xml;charset=\"utf-8\"";
reqVl.Accept = "text/xml";
reqVl.Method = "POST";

using (Stream stm = reqVl.GetRequestStream())
{
    using (StreamWriter stmw = new StreamWriter(stm))
    {
        stmw.Write(VLsoap);
    }
}

WebResponse responseVL = reqVl.GetResponse();
Stream responseStreamVL = responseVL.GetResponseStream();
XmlReader rdrVL = XmlReader.Create(responseStreamVL);

XmlDocument vls = new XmlDocument();
vls.Load(rdrVL);
4

1 に答える 1

0

ここにあなたが望むものを実現するためのコードがあります - しかし、これがあなたが望むものを得る最良の方法ではないかもしれない理由の説明については、その後のテキストを読んでください.

メッセージと.Net 4で動作するようにテストされています。

vls に SOAP メッセージが XML として含まれていると仮定すると、問題は 2 つに分割されます。SOAP メッセージを解析し、ノードのコンテンツを抽出して、GetValueListForFieldResult別のノードにロードできる文字列にデコードします。XmlDocument

パート IGetValueListForFieldResult -ノードの内容を取得する

  XmlNamespaceManager namespaceManager = new XmlNamespaceManager(vls.NameTable);
  namespaceManager.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
  namespaceManager.AddNamespace("default", "http://URLHere/webservices/");

  XmlNode payLoadNode =
    vls.SelectSingleNode("/soap:Envelope/soap:Body/default:GetValueListForFieldResponse/default:GetValueListForFieldResult", namespaceManager);

  string encodedXml = payLoadNode.InnerText;

パート II - エンコードされた文字列を Xml ドキュメントに取得する

この時点で、エンコードされた文字列が得られます。この HTML をデコードするには、いくつかの選択肢があります。私は.Net 4を使用しているので、最も単純なものを選びました:

  string decodedXml = WebUtility.HtmlDecode(encodedXml);

  XmlDocument payloadDocument = new XmlDocument();
  payloadDocument.LoadXml(decodedXml);

.Net 3.5 を使用している場合は、System.Web への参照を追加し、HttpUtility.HtmlDecode代わりに使用して文字列をデコードすることを検討する必要があります。

上記のメッセージを解析すると、次の結果が得られます。

<SelectDef>
  <Id>1736</Id>
  <SelectName>Values List</SelectName>
  <GlobalFlag>False</GlobalFlag>
  <Sort>1</Sort>
  <SelectDefValues>
    <SelectDefValue>
      <guid>aaf6f3a7-6a74-4187-b4e7-3a9355b16796</guid>
      <Id>14692</Id>
      <Name>Open</Name>
      <Description></Description>
      <Color>#000000</Color>
      <DefaultFlag>False</DefaultFlag>
      <SortOrder>1</SortOrder>
      <select_id>1736</select_id>
    </SelectDefValue>
    <SelectDefValue>
      <guid>f5082b54-d799-4fdc-80c1-0e232b360057</guid>
      <Id>14693</Id>
      <Name>Closed</Name>
      <Description></Description>
      <Color>#000000</Color>
      <DefaultFlag>False</DefaultFlag>
      <SortOrder>0</SortOrder>
      <select_id>1736</select_id>
    </SelectDefValue>
    <SelectDefValue>
      <guid>94e29e78-2ab3-463f-bbb6-ab7f36003c7f</guid>
      <Id>14780</Id>
      <Name>Past Due</Name>
      <Description></Description>
      <Color>#000000</Color>
      <DefaultFlag>False</DefaultFlag>
      <SortOrder>2</SortOrder>
      <select_id>1736</select_id>
    </SelectDefValue>
  </SelectDefValues>
</SelectDef>

オルタナティブ

この方法を使用したくない理由は、受信する応答が SOAP を使用してラップされているためです。したがって、接続しているサービスを Web サービスとして使用して、プロキシ ライブラリを生成することをお勧めします。これにより、上記のすべてのコードと、作成したコードがプロキシにカプセル化され、必要な値をよりタイプセーフで壊れにくい方法で取得できるようになります。これのサポートは .Net に組み込まれています。

さらに、接続先の URL は ASMX で終了するため、これはネイティブの .Net Web サービスである可能性が最も高いため、クライアントをそれに接続するのは簡単であることがわかります。

MSDN のトピック「Web サービスへの参照を追加する方法」は、プロキシを生成し、上記のすべてのコードを回避するのに役立ちます。

于 2013-01-15T16:52:26.410 に答える