2014-02-06 3 views
0

I Have 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; 
        } 
       } 
      } 

, но это дает мне ни HasError и ErroCode то же значение <ns2:errorCode> который <extendedInformation>Service Provider not known</extendedInformation> как я могу получить <hasError>true</hasError><status>STATUS_ERROR</status> значение только?

ответ

1

Вы можете попробовать использовать LINQ-to-XML, также предложенный @ noMad17. Что делает его не очень тривиальным, ваш 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"); 
} 
+1

Wow спасибо, работает правильно, да я пытался о xml.linq, но получаю сообщение об ошибке, и я забыл упомянуть пространство имен для проверки элемента. – Sabilv

1

Я рекомендую вам использовать System.Xml.Linq

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

Это даст вам тег вы хотели.

Смежные вопросы