XPath: diferencia entre el nodo () y el texto ()

Tengo problemas para entender la diferencia entre el text() y el node() . Por lo que entiendo, text() sería lo que se encuentre entre las tags apple que es apple en este caso. El nodo sería lo que sea que ese nodo sea en realidad, que sería un elemento

Pero luego me asignaron un trabajo en el que me pide que “seleccione el texto de todos los elementos en producción” y una pregunta por separado que pregunta “Seleccione todos los nodos de administrador en todos los departamentos”

¿Cómo se supone que el resultado se vea text() en lugar de node()

Fragmento de XML:

  apple banana pepper   123-456-7891 John  

Por supuesto, hay más departamentos y más gerentes, pero esto fue solo un fragmento de código.

¡Cualquier ayuda sería muy apreciada!

text() y node() son pruebas de nodo , en terminología XPath ( comparar ).

Las pruebas de nodo operan en un conjunto (en un eje , para ser exactos) de nodos y devuelven los que son de cierto tipo. Cuando no se menciona ningún eje, el eje child se asume por defecto.

Hay todo tipo de pruebas de nodo :

  • node() coincide con cualquier nodo (la prueba de nodo menos específica de todos)
  • text() coincide con los nodos de texto
  • comment() coincide con los nodos de comentario
  • * coincide con cualquier nodo de elemento
  • foo coincide con cualquier nodo de elemento llamado "foo"
  • processing-instruction() coincide con los nodos PI (se parecen a < ?name value?> ).
  • Nota al margen: * también coincide con los nodos de atributo, pero solo a lo largo del eje de attribute . @* es una abreviatura de attribute::* . Los atributos no son parte del eje child , es por eso que un * normal no los selecciona.

Este documento XML:

  apple banana pepper  

representa el siguiente DOM (simplificado):

 nodo raíz
    elemento nodo (name = "producir")
       nodo de texto (value = "\ n")
       nodo de elemento (nombre = "elemento")
          nodo de texto (value = "apple")
       nodo de texto (value = "\ n")
       nodo de elemento (nombre = "elemento")
          nodo de texto (value = "banana")
       nodo de texto (value = "\ n")
       nodo de elemento (nombre = "elemento")
          nodo de texto (valor = "pimienta")
       nodo de texto (value = "\ n")

Entonces con XPath:

  • / selecciona el nodo raíz
  • /produce selecciona un elemento hijo del nodo raíz si tiene el nombre "produce" (Esto se llama elemento del documento , representa el documento en sí. El elemento del documento y el nodo raíz a menudo se confunden, pero no son lo mismo).
  • /produce/node() selecciona cualquier tipo de nodo hijo debajo de /produce/ (es decir, los 7 hijos)
  • /produce/text() selecciona los 4 (!) nodos de texto de solo espacio en blanco
  • /produce/item[1] selecciona el primer elemento hijo llamado "item"
  • /produce/item[1]/text() selecciona todos los nodos de texto secundarios (solo hay uno – “manzana” – en este caso)

Y así.

Entonces, tus preguntas

  • “Seleccione el texto de todos los elementos en producir” /produce/item/text() (3 nodos seleccionados)
  • “Seleccionar todos los nodos de administrador en todos los departamentos” //department/manager (1 nodo seleccionado)

Notas

  • El eje predeterminado en XPath es el eje child . Puede cambiar el eje prefijando un nombre de eje diferente. Por ejemplo: //item/ancestor::produce
  • Los nodos de elementos tienen valores de texto. Cuando evalúa un nodo de elemento, se devolverá su contenido textual. En el caso de este ejemplo, /produce/item[1]/text() y string(/produce/item[1]) será el mismo.
  • También vea esta respuesta donde esbozo gráficamente las partes individuales de una expresión XPath.

Seleccione el texto de todos los elementos en producir:

 //produce/item/text() 

Seleccione todos los nodos de administrador en todos los departamentos:

 //department/*