2009-03-27 20 views
5

Suponiendo que no sé el nombre de mi nodo base o sus elementos secundarios, ¿cuál es la sintaxis de XPath para "todos los nodos exactamente uno debajo del nodo base?"¿Cuál es el XPath correcto para "todos los nodos exactamente uno debajo del nodo base?"

Con el patrón de ser un XmlNode, tengo el siguiente código:

XmlNodeList kvpsList = pattern.SelectNodes(@"//"); 

que se ve bien para mí, pero me da la siguiente excepción:

System.Xml.XPath.XPathException: Expression must evaluate to a node-set. 

¿Cuál es la sintaxis correcta?

+0

Nota para los lectores posteriores: por "nodo de base", Jekke aparentemente significa el elemento de nivel superior (también conocido como el "elemento de documento" o "elemento más externo").El uso de Jekke es confuso porque * no * significa el nodo raíz (/), que es el padre del elemento de nivel superior. – LarsH

Respuesta

7

Las dos respuestas actuales son erróneas:

/*/* 

no selecciona todos los nodos que son hijos del nodo superior. No selecciona ningún nodo de texto, instrucciones de procesamiento o comentarios secundarios del elemento superior.

expresión Una XPath que seleccionar todos los nodos que ARTE hijos del elemento superior es:

/*/node()

// no es una expresión XPath sintácticamente correcto; de acuerdo con el XPath Spec:

// es la abreviatura de /descendiente-or-self :: node()/

hacer la nota el comienzo de un paso de localización sin terminar en el final de la abreviatura expandida. Si no se le agrega nada, toda la expresión XPath que contiene la abreviatura se finaliza y, por lo tanto, es sintácticamente incorrecta.

Otra nota es que la abreviatura // no es necesaria al especificar la selección de todos los nodos que son secundarios del elemento superior. Si desea seleccionar todos los nodos del documento XML que descienden del elemento superior, a continuación, una expresión XPath que seleccionar estos es:

/*//node()

8

El camino que estás buscando es

/*/* 

// no es una expresión XPath significativo, ya que es un operador. Si escribió algo como //element, coincidiría con todos los elementos denominados element en cualquier lugar del documento XML, sin importar cuán profunda sea la jerarquía.

/*/* dice "unir todos los nodos que tienen dos niveles de profundidad en la jerarquía".

+0

tanto esta respuesta como @Jweede confunden los términos "nodo" y "elemento". Sospecho que @Jekke también confundió los términos, por lo que estas respuestas son correctas con respecto a lo que quiso decir, pero no con respecto a lo que dijo. Los "nodos" incluyen elementos, atributos, nodos de texto, nodos raíz y otros. Los elementos son las cosas expresadas con las etiquetas de inicio/finalización: ''. El XPath "*" sin eje especificado solo coincide con * elementos *. Vea la respuesta de @ Dimitre para obtener más información al respecto. – LarsH

Cuestiones relacionadas