online net name attribute .net xpath

.net - net - xpath wildcard



XPath y Seleccionar un solo nodo (4)

El // que usa enfrente de stuffChild significa que está buscando elementos stuffChild , comenzando desde la raíz.

Si desea comenzar desde el nodo actual (descendencias del nodo actual), debe usar .// , como en:

stuff.SelectSingleNode(".//stuffChild");

Estoy usando XPath en .NET para analizar un documento XML, a lo largo de las líneas de:

XmlNodeList lotsOStuff = doc.SelectNodes("//stuff"); foreach (XmlNode stuff in lotsOStuff) { XmlNode stuffChild = stuff.SelectSingleNode("//stuffChild"); // ... etc }

El problema es que XPath Query para stuffChild siempre devuelve el elemento secundario al primer elemento, nunca el resto. ¿Puede XPath no usarse para consultar contra un XMLElement individual?


Si "stuffChild" es un nodo secundario de "cosas", entonces tu xpath solo debería ser:

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild");


Al seleccionar un solo nodo, significa que solo necesita el primer elemento. Entonces, la mejor solución es:

XmlNode stuffChild = stuff.SelectSingleNode("descendant::stuffChild[1]");


// al comienzo de una expresión XPath comienza desde la raíz del documento. Prueba ".//stuffChild". . es una abreviatura de self :: node (), que establecerá el contexto para la búsqueda, y // es una abreviación para el eje descendiente.

Así que tienes:

XmlNode stuffChild = stuff.SelectSingleNode(".//stuffChild");

que se traduce a:

xmlNode stuffChild = stuff.SelectSingleNode ("self :: node () / descenddant :: stuffChild");

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant-or-self::stuffChild");

En el caso en que el nodo secundario podría tener el mismo nombre que el elemento principal, le recomendamos utilizar la sintaxis más detallada que sigue, para asegurarse de no volver a seleccionar el elemento principal:

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant::stuffChild");

También tenga en cuenta que si "stuffChild" es un descendiente directo de "cosas", puede omitir por completo los prefijos, y simplemente seleccione "stuffChild".

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild");

El tutorial de W3Schools tiene información útil en un formato fácil de digerir.