Получить все дочерние узлы из XmlNode по узлам

#c# #xml #.net-core

#c# #xml #.net-ядро

Вопрос:

У меня есть XML, подобный следующему:

 <config>
 <EPackets>
  <packet>
   <id> 1 </id>
   <name> packet1 </name>
   <variables>
    <variable>
     <id> 1 </id>
     <name> packet1var1 </id>
    </variable>
    <variable>
     <id> 2 </id>
     <name> packet1var2 </id>
    </variable>
   </variables>
  </packet>
  <packet>
   <id> 2 </id>
   <name> packet2 </name>
   <variables>
    <variable>
     <id> 1 </id>
     <name> packet2var1 </id>
    </variable>
    <variable>
     <id> 2 </id>
     <name> packet2var2 </id>
    </variable>
   </variables>
  </packet>
 </EPackets>
</config>
 

Для краткости давайте предположим, что я хочу печатать указанные узлы только с помощью консоли следующим образом:

 Config contains:
packet: packet1
id: 1
variables of the packet:
-- name: packet1var1
-- id: 1
-- name: packet1var2
-- id: 2
packet: packet2
id: 2
variables of the packet:
-- name: packet2var1
-- id: 1
-- name: packet2var2
-- id: 2
 

На данный момент я могу получить внешнюю информацию, но когда я пытаюсь получить доступ к внутренним переменным элемента для каждого пакета, ничего не возвращается (внутренний foreach):

 List<XmlNode> PacketList = variablesSettings.getNodes("config.EPackets.packet");

log("Config contains: ", DEBUG);

foreach (XmlNode packet in PacketList)
{
    int packetId = Convert.ToInt32(packet.SelectSingleNode("id").InnerText);
    String packetName = packet.SelectSingleNode("nombre").InnerText;

    log("packet: "   packetName, DEBUG);
    log("id: "   packetId, DEBUG);
    log("variables of the packet: ", DEBUG);

    foreach (XmlNode variable in packet.SelectNodes("variables.variable"))
    {
        String variableName = variable.SelectSingleNode("name").InnerText;
        String variableId = variable.SelectSingleNode("id").InnerText;

        log("name: "   variableName, DEBUG);
        log("id: "   variableId, DEBUG);
    }
}
 

Что я здесь делаю не так? любая информация будет оценена.

Подводя итог, проблема заключается в том, что когда я пытаюсь получить внутренние узлы (переменные) из каждого пакета, используя эту строку foreach (XmlNode variable in packet.SelectNodes("variables.variable") , программа завершается (она находит 0 узлов с этим именем)

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

1. String variableName = packet . SelectSingleNode(«имя»). innerText; String variableId = packet. SelectSingleNode(«id»). innerText; — следует ли использовать из переменной вместо пакета?

2. @Mohan вы правы, но это была опечатка, у меня есть это с vriable в моем коде.

3. Вы используете неправильный XPath SelectNode . Вы должны использовать / (не . ) в качестве селектора потомков. Правильный XPath packet.SelectNodes("variables/variable") . Однако я не уверен variablesSettings.getNodes(…) , потому что мы не знаем, что это за тип variablesSettings .

4. @PeterWolf Я понимаю, что ты имеешь в виду. Я нашел обходной путь, в котором я могу выбрать последний дочерний элемент пакета, а затем выполнить итерацию там (это дает желаемый результат)