2014-02-06 157 views
0

我有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的相同的值这是<extendedInformation>Service Provider not known</extendedInformation>我怎么能得到<hasError>true</hasError><status>STATUS_ERROR</status>价值只?

回答

1

也可以尝试使用LINQ-to-XML,正如@noMad17所建议的那样。是什么让它不是微不足道的,你的XML有名称空间。因此,我们需要定义XNamespace s到可以用来匹配元素名称:

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"); 
} 
+1

哇谢谢你,工作正常,是的,我已经试过对xml.linq但一直得到错误的,我忘了提命名空间检查元素。 – Sabilv

1

我建议你使用System.Xml.Linq

XElement elem = xDocument.Descendants("hasErrors").FirstOrDefault(); 

这会给你你想要的标签。