我从服务响应中获取XML,以下是示例:
<?xml version="1.0"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns4:loginResponse xmlns="http://www.website.com/IncTypes" xmlns:ns2="http://yyy.website.com/Security" xmlns:ns3="http://yyy.incognito.com/Service" xmlns:ns4="http:/yyy.website.com/wsdl/Security">
<ns2:errorCode>
<hasError>true</hasError>
<status>STATUS_ERROR</status>
<problemCode>-1</problemCode>
<problemMessage>Service Provider
not known</problemMessage>
<extendedInformation>Service Provider
not known</extendedInformation>
</ns2:errorCode>
</ns4:loginResponse>
</S:Body>
</S:Envelope>
我只想获得此标记的值
<hasError>true</hasError>
<status>STATUS_ERROR</status>
<problemCode>-1</problemCode>
<problemMessage>Service Provider
这是我的C#代码:
foreach (XmlNode node in loginresp.DocumentElement)
{
if (node.FirstChild.FirstChild.HasChildNodes == true)
{
foreach (XmlNode y in node.FirstChild.FirstChild.ChildNodes)
{
HasError = y.InnerXml;
status= y.InnerXml;
}
}
}
但它为HasError
和ErroCode
提供<ns2:errorCode>
<extendedInformation>Service Provider not known</extendedInformation>
的相同值<hasError>true</hasError>
我怎样才能获得<status>STATUS_ERROR</status>
{{1}}值只是?
答案 0 :(得分:1)
我建议您使用System.Xml.Linq
XElement elem = xDocument.Descendants("hasErrors").FirstOrDefault();
这会给你你想要的标签。
答案 1 :(得分:1)
您可以尝试使用@ noMad17建议的LINQ-to-XML。什么使它不是非常微不足道的是,你的xml有名称空间。因此,我们需要定义XNamespace
来用于匹配元素名称:
XNamespace ns = "http://www.website.com/IncTypes";
XNamespace ns2 = "http://yyy.website.com/Security";
var loginresp = XDocument.Parse("xml string here");
//get <ns2:errorCode> element
var errorCode = loginresp.Descendants(ns2 + "errorCode").FirstOrDefault();
if(errorCode != null)
{
//get <hasError> element under <ns2:errorCode>
var hasError = (string)errorCode.Element(ns + "hasError");
//get <status> element under <ns2:errorCode>
var status = (string)errorCode.Element(ns + "status");
}