2015-07-15 2 views
0

В моем приложении я получаю XML Response, и я пытаюсь преобразовать этот ответ XML, используя XmlNode.XML-анализ с использованием XmlNode

Мой XML-файл: File

XML-контента будет как:

<account name="[email protected]" id="876e6b55-5a9c-44ff-a418-af737c47d2af"> 
    <a n="mobile">91 998977245009</a> 
    <a n="zimbraMailDeliveryAddress">[email protected]</a> 
    <a n="zimbraPrefIMLogChats">TRUE</a> 
</account> 
<account name="[email protected]" id="ce91d3bf-83b8-4a55-a92e-2e080fa4a21b"> 
    <a n="zimbraMailDeliveryAddress">[email protected]</a> 
    <a n="zimbraPrefShowSearchString">FALSE</a> 
    <a n="zimbraPrefIMLogChats">TRUE</a> 
</account> 

Здесь я показываю два примера счета из этого XML-ответ, и мне нужно Переберите все account nodes и получить zimbraMailDeliveryAddress, который, несомненно, будет доступен в каждом узле, а также значение mobile значения элемента ('91 998977245009'), которое может быть недоступно в каждом узле (т. е. тег вообще не будет доступен).

Есть ли способ получить эти значения?

Я попытался с помощью XmlNamespaceManager так:

XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable); 
mgr.AddNamespace("bc", "urn:zimbraAdmin"); 
XmlNode result = doc.SelectSingleNode("//bc:account", mgr); 
if (result != null) 
{ 
    Console.WriteLine("Found {0}.", result.InnerText); 
} 
else 
{ 
    // handle case that no element was found 
    Console.WriteLine("No element found."); 
} 

Но с помощью этого кода, я получаю только first account node данные, и я не смог перебрать all account nodes.

Может ли кто-нибудь мне помочь?

+1

Может быть, '' SelectNodes' вместо SelectSingleNode'? – splash58

ответ

1

я предлагаю канав XmlDocument и XPath и с помощью LINQ к XML вместо:

var doc = XDocument.Parse(xml); 

XNamespace ns = "urn:zimbraAdmin"; 

foreach (var account in doc.Descendants(ns + "account")) 
{ 
    var mobile = (string)account.Elements(ns + "a") 
     .SingleOrDefault(e => (string)e.Attribute("n") == "mobile"); 

    var address = (string)account.Elements(ns + "a") 
     .SingleOrDefault(e => (string)e.Attribute("n") == "zimbraMailDeliveryAddress"); 
} 

Смотрите рабочую демонстрацию, используя файл здесь: https://dotnetfiddle.net/UOV40v

0

SelectSingleNode возвращает только один узел. SelectNodes возвращает список узлов (XmlNodeList) и может быть тем, что вы ищете, чтобы получить их все.

Link to the specification of XmlNode.SelectNodes

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