selecting Nodes from XML using Linq to Xml
Пробую выбрать элемент, используя Linq to Xml
это XML ответ от сервера:
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>items</name>
<value>
<array>
<data>
<value>
<struct>
<member>
<name>id</name>
<value>
<int>17</int>
</value>
</member>
<member>
<name>name</name>
<value>
<string>test2</string>
</value>
</struct>
</value>
</data>
</array>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>
Мне нужно выбрать (хотя бы вывести)
<string>test2</string>
name = test2;
and
<int>17</int>
id = 17
Я пробую это:
...
var xml = new XDocument();
var result = response.Content.ReadAsStringAsync().Result;
xml = XDocument.Parse(result);
...
var selectors = from elements in xml.Elements("methodResponse").Elements("params").Elements("param")
.Elements("value").Elements("struct").Elements("member")
select elements;
foreach (var element in selectors)
{
if (element.Element("name").Value == "items")
{
Console.WriteLine(element.Element("name"));
}
}
Результат выполнения: "items" Как корректно выбрать из xml значения?
Ответы (1 шт):
Автор решения: Alexander Petrov
→ Ссылка
Попробуйте так:
using System.Xml.Linq;
var doc = XDocument.Load("test.xml");
foreach (var member in doc.Descendants("member"))
{
var name = member.Element("name").Value;
Console.WriteLine(name);
var value = member.Element("value");
var child = (XElement)value.FirstNode;
if (child.Name == "array")
{
Console.WriteLine("Type: array");
}
else
{
Console.WriteLine("Type: " + child.Name);
Console.WriteLine(child.Value);
}
Console.WriteLine();
}
Ключевыми элементами являются узлы "member", вот от них и танцуем. Берём имя, а потом проверяем тип первого элемента внутри "value".
Если могут быть вложенные массивы, то проверку следует сделать рекурсивной.