El uso de XPath para analizar un documento XML

Permite decir que tengo el siguiente xml (un ejemplo rápido)

<rows>
   <row>
      <name>one</name>
   </row>
   <row>
      <name>two</name>
   </row>
</rows>

Estoy tratando de analizar esta utilizando XmlDocument y XPath (en última instancia, por lo que puede hacer una lista de las filas).

Por ejemplo…

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);

foreach(XmlNode row in doc.SelectNodes("//row"))
{
   string rowName = row.SelectSingleNode("//name").InnerText;
}

Por qué, dentro de mi bucle foreach, es rowName siempre “uno”? Estoy esperando a ser “uno” en la primera iteración y “dos” en el segundo.

Parece que //nombre recibe la primera instancia en el documento, en lugar de la primera instancia en la fila como cabría esperar. Después de todo, estoy llamando al método en la “fila” nodo. Si este es el “cómo funciona” entonces, ¿alguien puede por favor explicar cómo podría cambiar para que trabaje para mis necesidades?

Gracias

cómo acerca de la selección por //fila/nombre? Hace este trabajo?

OriginalEl autor musefan | 2011-11-28

7 respuestas

  1. 16
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);
    
    foreach(XmlNode row in doc.SelectNodes("//row"))
    {
       var rowName = row.SelectSingleNode("name");
    }

    Es el código que has publicado realmente correcto? Tengo un error de compilación en la fila.SelectNode (), ya que no es un miembro de XmlNode.

    De todos modos, mi ejemplo anterior funciona, pero supone sólo un único <name> nodo dentro de la <row> nodo, de modo que usted puede necesitar usar SelectNodes() en lugar de SelectSingleNode() si ese no es el caso.

    Como otros han demostrado, el uso de .InnerText para obtener el valor.

    Gracias, y su velocidad se consigue la total 25! Me había llegado tan lejos como tratar con un solo de slash, pero cuando tiró un error me di por vencido y escribió una función de búsqueda de nodos secundarios. Soy nuevo en el buen ol’ XPath ahora, sin embargo 🙂
    Se olvidó de la .InnerText en mi post original, fija ahora… y equivocado SelectSingleNode

    OriginalEl autor Sir Crispalot

  2. 4

    Uso de LINQ to XML. Incluyen using System.Xml.Linq; en su archivo de código y, a continuación, hacer el siguiente código para obtener su lista de

    XDocument xDoc = XDocument.Load(filepath);
    IEnumerable<XElement> xNames;
    
    xNames = xDoc.Descendants("name");

    Que le dará una lista de los nombre de los elementos. Entonces, si usted quiere convertir en un List<string> basta con hacer:

    List<string> list = new List<string>();
    foreach (XElement element in xNames)
    {
        list.Add(element.value);
    }

    OriginalEl autor Levi Botelho

  3. 4

    Su segundo xpath se inicia con //. Esta es una abreviatura para /descendant-or-self::node(), que se puede ver se inicia con /, lo que significa que las búsquedas de la raíz del documento, cualquiera que sea el contexto en que se use.

    Usted probablemente querrá una de:

    var rowName = row.SelectSingleNode("name");

    para encontrar el name nodos que son inmediata niños de la row, o

    var rowName = row.SelectSingleNode(".//name");

    encontrar name nodos *en cualquier lugar bajothefila. Note the.` en esta segunda xpath que hace que el xpath para iniciar desde el nodo de contexto.

    OriginalEl autor AakashM

  4. 3

    Utilizar una ruta relativa por ejemplo,string rowName = row.SelectSingleNode("name").InnerText;.

    OriginalEl autor Martin Honnen

  5. 2

    El problema está en su segunda consulta XPath:

    //row

    Este tiene un alcance global, así que no importa donde usted lo llama desde, seleccione todos row elementos.

    Debería funcionar si reemplazar su expresión con:

    .//row

    OriginalEl autor madd0

  6. 2

    Me gustaría utilizar SelectSingleNode y, a continuación, el valor de la propiedad InnerText.

    var rowName = row.SelectSingleNode("name").InnerText;

    OriginalEl autor DaveShaw

  7. 0

    Utilice el siguiente

            doc.LoadXml(xml);
    
                foreach(XmlNode row in doc.SelectNodes("/rows/row"))
                {
                    string rowName = row.SelectSingleNode("//name").InnerText.ToString();
                }
    Que va a causar el mismo problema que yo tenía, para empezar, lo siento
    Permítanme parafrasear lol, me deshice de los /las filas y sólo lo hizo como //fila y trabajó para mí.

    OriginalEl autor Ryguy

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *