Obtenga todos los nodos infantiles de XmlNode por nodo

Tengo un XML como el siguiente:


 
  
    1 
    packet1 
   
    
      1 
      packet1var1 
    
    
      2 
      packet1var2 
    
   
  
  
    2 
    packet2 
   
    
      1 
      packet2var1 
    
    
      2 
      packet2var2 
    
   
  
 

Por el bien de la brevedad, asumamos que sólo quiero imprimir dichos nodos por consola de la siguiente manera:

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

En el momento en que puedo obtener la información externa, pero cuando intento acceder a las variables de elemento interno para cada paquete, nada se devuelve (entrenamiento interno):

List 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);
    }
}

¿Qué estoy haciendo mal aquí? cualquier información sería apreciada.

El problema, para resumir, es que cuando intento conseguir los nodos interiores (variables) de cada paquete usando esta línea foreach (XmlNode variable in packet.SelectNodes("variables.variable") el programa termina (Encontra 0 nodos con ese nombre)

Pregunta hecha hace 3 años, 5 meses, 0 días - Por codealchemyf00f


2 Respuestas:

  • El problema radica en cómo estás intentando acceder a los nodos internos (variables) de cada paquete en el XML. Cuando utilizas el método SelectNodes("variables.variable"), estás tratando de seleccionar nodos que están directamente dentro de <packet> con el nombre <variables.variable>, lo cual no es correcto ya que <variables> y <variable> son nodos secundarios de <packet> y no están anidados directamente uno dentro del otro.

    Para solucionar este problema, debes ajustar la forma en que seleccionas los nodos internos. En lugar de utilizar "variables.variable", debes seleccionar directamente las referencias a los nodos <variables> y luego dentro de estos nodos, seleccionar todos los nodos <variable>.

    Aquí te muestro cómo puedes corregir tu código para obtener los resultados esperados:

    csharp
    List 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("name").InnerText;
    
        log("packet: " + packetName, DEBUG);
        log("id: " + packetId, DEBUG);
        log("variables of the packet: ", DEBUG);
    
        XmlNodeList variablesList = packet.SelectNodes("variables/variable");
    
        foreach (XmlNode variable in variablesList)
        {
            String variableName = variable.SelectSingleNode("name").InnerText;
            String variableId = variable.SelectSingleNode("id").InnerText;
    
            log("name: " + variableName, DEBUG);
            log("id: " + variableId, DEBUG);
        }
    }
    

    Con esta modificación, ahora deberías poder acceder correctamente a los nodos internos <variable> de cada paquete en tu XML.

    Respondida el Dec 18, 2020 a las 11:58 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema es que estás utilizando un separador de puntos (.) en tu XPath cuando deberías estar usando una barra diagonal (/).

    El XPath correcto para seleccionar los nodos variables es:

    
    foreach (XmlNode variable in packet.SelectNodes("variables/variable")
    

    Aquí tienes el código corregido:

    
    List 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);
        }
    }
    

    Respondida el Dec 18, 2020 a las 12:00 - por Gemini

    Votos positivos: 0 | Votos negativos: 0