2010-02-10 13 views
18

mi problema es así. Digamos que tengo xml como esteXmlNode.SelectSingleNode devuelve elemento fuera de la corriente?

<root> 
    <child Name = "child1"> 
    <element1>Value1</element1> 
    <element2>Value2</element2> 
    </child> 
    <child Name = "child2"> 
    <element1>Value1</element1> 
    <element2>Value2</element2> 
    <element3>Value3</element3> 
    </child> 
</root> 

Tengo un método que obtiene como parámetro XmlNode "nodo". Digamos que "nodo" tiene el valor "child1" Entonces trato de esta manera:

node.SelectSingleNode("//element3"); 

El problema es el siguiente código devuelve Element3 de "child2". Lo que quiero es que no haya un "elemento3" hijo de "nodo" para devolver nulo, así que lo agrego a mano.
Best Regards,
Iordand

+2

Esa es una expresión absoluta abreviada. Se expandiría a '/ descenddant-or-self :: node()/child :: element3'. Significado: * desde la raíz del documento del nodo de contexto a través de todos sus nodos descendientes, seleccione un elemento hijo con QName igual a 'element3' * –

Respuesta

21

La expresión XPath que tienes no es lo que quiere.

reemplazarlo por este:

node.SelectSingleNode("element3"); 

y obtendrá el resultado que busca.

+3

O alternativamente" ./element3 "ya que puede ayudar a aclarar lo que significa. –

+1

Sólo una cosa más para preguntar si "element3" no es hijo directo de "child" pero hay otro nodo entre lo que xpath usar? – IordanTanev

+3

@lordanTanev: Puedes poner // entre el nodo en el que estás actualmente y el nodo que deseas, como este: '.// element3'. – Welbog

8

El "//" es una búsqueda global.

Lo que necesitan hacer es obtener una lista de todos los niños

XmlNodeList nodes = xmlDoc.SelectNodes("//Child"); 

bucle a través de esa lista y hacer un

XmlNode node = nodes.SelectSingleNode("element3"); 

Esto devolverá un valor nulo si no está ahí, y paso a través de cada niño mirando.

3

el problema aquí es la expresión XPath que está utilizando, pruébelo sin el '//'. Al igual que:

node.SelectSingleNode("element3");

Leer más here.

6

El siguiente trabajo es perfecto cuando quiero ejecutar xpath en el nodo especificado.

XmlNodeList nodes = xmlDoc.SelectNodes(".//Child"); 
Cuestiones relacionadas