NodeList для отображения списка

1

В настоящее время у меня проблема с отправкой результатов xmlnodelist в обычный список с приведенным ниже кодом.

var xmlDoc = new XmlDocument();
xmlDoc.Load(textBox1.Text);

var node = xmlDoc.SelectNodes("pdml/packet/proto/field[@name='ip.src']/@show");
list.Items.Add(node);

Насколько я понимаю, SelectNodes возьмет все узлы с этим именем XPath и поместит их в список. Когда я добавляю их в стандартный список, я вижу это:

System.Xml.XPathNodeList

Для справки, этот конкретный xml выглядит так (это часть гораздо большего раздела):

 <pdml>
 <packet>
 <proto>
 <field name="ip.src" showname="Source: 192.168.1.204 (192.168.1.204)" size="4" pos="26" show="192.168.1.204" value="c0a801cc"/>
 </proto>
 </packet>
 </pdml>

Как преобразовать это в то, что содержится в NodeList?

Дополнительная помощь: также как я мог работать с данными, содержащимися в NodeList? например, я могу установить его как уникальный идентификатор и назначить ему другие данные узла.

Спасибо, Том

  • 0
    Вы хотите получить все данные из каждого «поля» в списке?
  • 0
    Данные, которые я хочу получить, - это шоу: 192.168.1.204. но из каждого поля в документе XML с этим XPath.
Теги:
xpath

3 ответа

0
Лучший ответ

node содержит коллекцию XmlAttribute. Я полагаю, вы хотели добавить Value каждого атрибута в list.Items:

foreach (XmlAttribute attribute in node)
{
    list.Items.Add(attribute.Value);
}

или, возможно, с помощью AddRange() и LINQ, чтобы сразу добавить все значения атрибутов:

list.Items.AddRange(from XmlAttribute attribute in node select attribute.Value);
  • 0
    Оператор foreach прекрасно работает! Большое спасибо!
  • 0
    @ Добро пожаловать
Показать ещё 2 комментария
1

Я думаю, что это вариант, но вам нужно создать список "показов":

XDocument xDoc = XDocument.Load("your xml file");
foreach (var elem in xDoc.Document.Descendants("field[@name='ip.src']"))
{
    shows.Add(elem.Attribute("show").Value);
}
  • 0
    Спасибо за ответ, это, вероятно, сработает в случае вышеупомянутого примера пакета, но полная версия имеет около 40 или 50 «полей», многие из которых также содержат атрибуты «show». Еще раз спасибо за быстрый ответ.
  • 0
    Это будет работать для всех элементов "поле" в этом XML;) не только один
Показать ещё 3 комментария
0

Вы должны добавить каждый элемент в список, а не коллекцию, как один элемент в списке. Поскольку в списке есть только один элемент типа XmlNodeList, он вызывает ToString для этого объекта, и это приводит к сообщению System.Xml.XPathNodeList. Вы должны использовать list.Items.AddRange если он существует (непонятно, какую инфраструктуру пользовательского интерфейса вы используете), или вы должны перебирать коллекцию XmlNodeList:

var xmlDoc = new XmlDocument();
xmlDoc.Load(textBox1.Text);

var nodes = xmlDoc.SelectNodes("pdml/packet/proto/field[@name='ip.src']/@show");
foreach(var node in nodes)
    list.Items.Add(node);
  • 0
    Спасибо за ответ. Когда я вставляю приведенный выше код, он возвращает: System.Xml.XMLAttribute. По-прежнему нет данных.
  • 0
    Как указано в моем ответе, вместо XmlAttribute сам по себе его Value должно быть добавлено в Items : list.Items.Add(node.Value)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню