xml - expressions - XPath: diferencia entre el nodo() y el texto()
xpath php (2)
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 etiquetas <item>apple</item>
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:
<produce>
<item>apple</item>
<item>banana</item>
<item>pepper</item>
</produce>
<department>
<phone>123-456-7891</phone>
<manager>John</manager>
</department>
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!
Seleccione el texto de todos los elementos en producir:
//produce/item/text()
Seleccione todos los nodos de administrador en todos los departamentos:
//department/*
text()
y node()
son pruebas de nodo , en terminología XPath ( compare ).
Las pruebas de nodo operan en un conjunto (en un axis , 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 deattribute
.@*
es una abreviatura deattribute::*
. Los atributos no son parte del ejechild
, es por eso que un*
normal no los selecciona.
Este documento XML:
<produce>
<item>apple</item>
<item>banana</item>
<item>pepper</item>
</produce>
representa el siguiente DOM (simplificado):
root node element node (name="produce") text node (value="/n ") element node (name="item") text node (value="apple") text node (value="/n ") element node (name="item") text node (value="banana") text node (value="/n ") element node (name="item") text node (value="pepper") text node (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()
ystring(/produce/item[1])
será el mismo. - También vea esta respuesta donde esbozo gráficamente las partes individuales de una expresión XPath.