0

私はこれをしばらく探していましたが、解決策が見つかりません。xmldocument にロードした HttpWebRequest から返された xml があり、リクエストの特定の属性 (ステータス) を取得しようとしています。返される xml は次のとおりです。

<soapenv:Envelope
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  >
  <soapenv:Body>
    <processRequestResponse>
      <parameters>
        <ns1:searchResponse status="success" xmlns:ns1="urn:oasis:names:tc:SPML:2:0:search">
          <ns1:pso>
            <ns2:psoID ID="Users:####" xmlns:ns2="urn:oasis:names:tc:SPML:2:0"/>
            <ns3:data xmlns:ns3="urn:oasis:names:tc:SPML:2:0">
              <ns4:attr name="Users.User ID" xmlns:ns4="urn:oasis:names:tc:DSML:2:0:core">
                <ns4:value></ns4:value>
              </ns4:attr>
            </ns3:data>
          </ns1:pso>
        </ns1:searchResponse>
      </parameters>
    </processRequestResponse>
  </soapenv:Body>
</soapenv:Envelope>

このデータを取得するために使用しているコードは以下のとおりです。

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string returnResponse = reader.ReadToEnd();

XmlDocument doc = new XmlDocument();
doc.LoadXml(returnResponse);

XmlNode root = doc.DocumentElement;
XmlNode searchResponse = root.SelectSingleNode("Envelope/Body/processRequestResponse/parameters/searchResponse");
XmlAttribute status = (XmlAttribute)searchResponse.Attributes.GetNamedItem("status");
if (status != null)
{
    string statusReturn = status.Value;
    return statusReturn;
}
else
{
    return "value is null";
}

ステータス値についてご協力いただけると幸いです。xmlattrbute ステータス ラインにオブジェクト参照エラーが表示され続けます。

4

2 に答える 2

3

XML ドキュメントには名前空間が含まれています。XPath クエリが機能する前に、XML ドキュメント内の名前空間を考慮する必要があります。

これらの名前空間を C# コードに追加して XPath で参照する方法については、この質問を参照してくださいまたは、ワイルドカード マッチングの使用方法については、この質問を参照してください (ただし、要素名ごとに行う必要があるため、この場合は面倒になります)。

于 2012-07-31T21:45:36.867 に答える
0

サイズについてはこれを試してください:

        const string ValueIsNull = "value is null";
        string returnResponse;

        using (var response = (HttpWebResponse)request.GetResponse())
        {
            if (response == null)
            {
                return ValueIsNull;
            }

            using (var responseStream = response.GetResponseStream())
            {
                if (responseStream == null)
                {
                    return ValueIsNull;
                }

                using (var reader = new StreamReader(responseStream))
                {
                    returnResponse = reader.ReadToEnd();
                }
            }
        }

        var doc = new XmlDocument();

        doc.LoadXml(returnResponse);

        var namespaces = new XmlNamespaceManager(doc.NameTable);

        namespaces.AddNamespace("soapenv", "http://schemas.xmlsoap.org/soap/envelope/");
        namespaces.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema");
        namespaces.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
        namespaces.AddNamespace("ns1", "urn:oasis:names:tc:SPML:2:0:search");
        namespaces.AddNamespace("ns2", "urn:oasis:names:tc:SPML:2:0");
        namespaces.AddNamespace("ns3", "urn:oasis:names:tc:SPML:2:0");
        namespaces.AddNamespace("ns4", "urn:oasis:names:tc:DSML:2:0:core");

        XmlNode root = doc.DocumentElement;

        if (root == null)
        {
            return ValueIsNull;
        }

        var searchResponse = root.SelectSingleNode("/soapenv:Envelope/soapenv:Body/processRequestResponse/parameters/ns1:searchResponse", namespaces);

        if ((searchResponse == null) || (searchResponse.Attributes == null))
        {
            return ValueIsNull;
        }

        var status = (XmlAttribute)searchResponse.Attributes.GetNamedItem("status");

        return status == null ? ValueIsNull : status.Value;
于 2012-07-31T22:11:37.750 に答える