按标签名称读取XML

时间:2014-02-06 05:16:15

标签: c# xml

我从服务响应中获取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;
                    }
                }
            }

但它为HasErrorErroCode提供<ns2:errorCode> <extendedInformation>Service Provider not known</extendedInformation>的相同值<hasError>true</hasError>我怎样才能获得<status>STATUS_ERROR</status> {{1}}值只是?

2 个答案:

答案 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");
}