SelectSingleNode() при сбое XPath C#

#c# #xml #selectsinglenode

#c# #xml #selectsinglenode

Вопрос:

я получил XML-файл в качестве экспорта из Wireshark и хочу выбрать номер фактического кадра

Структура этого файла выглядит следующим образом

 <packet>
    <proto>
        ...
    </proto>
    ....
    <proto>
        <field name="frame.number" show="1">
    </proto>
</packet>
<packet>
    <proto>
        ...
    </proto>
    ....
    <proto>
        <field name="frame.number" show="2">
    </proto>
</packet>
  

…и так далее…

Я использую этот код для выбора пакетов / полей

 XmlNodeList packages = xmlDoc.SelectNodes("//packet");
foreach (XmlNode packet in packages) {
    string frameNumber = packet.SelectSingleNode("//field[@name='frame.number']").
        Attributes["show"].Value;
    Console.WriteLine(frameNumber);
}
  

Если я выполняю отладку с помощью кода, он всегда выбирает правильные узлы с правильными атрибутами. Но на каждой итерации выводится «1».

Кто-нибудь подозревает, что это за сбой? Я ничего не нашел в Интернете для этого сбоя

Большое вам спасибо!!

Ответ №1:

Это потому, что ваш XPath в SelectSingleNode начинается с // , что означает «начать с корня документа». Поэтому вы всегда получаете первый.

Просто измените XPath в этом методе на proto/field[@name='frame.number'] .

Комментарии:

1. Спасибо! Я думаю, что начинать с // означает: «начинать с фактического узла вниз. Теперь я знаю, что я был неправ 😉