我已经搜索了一段时间,但无法找到解决方案。我有一个从HttpWebRequest返回的xml,我加载到xmldocument中,我试图获取请求的特定属性(状态)。返回的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状态行得到一个对象引用错误。
答案 0 :(得分:3)
您的XML文档包含名称空间。在任何XPath查询起作用之前,您需要在XML文档中考虑名称空间。
有关如何在C#代码中添加这些命名空间并在XPath中引用它们,请参阅this question;或者看this question如何使用通配符匹配(虽然在你的情况下会变得混乱,因为你必须为每个元素名称执行它。)
答案 1 :(得分: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;