2010-07-23 39 views
15

Tengo un problema para encontrar la sintaxis correcta de XPath para verificar si existe un nodo en mi XML. Solo puedo usar XPath (así que no hay XSL ni nada parecido, tiene que ser una sintaxis pura de expresiones XPath).Comprobación de XPath para el nodo no existente

Tengo un XML y tiene un nodo Filename pero no existe en todos los casos. Cuando no se especifica el nombre del archivo, mi proceso LiveCycle utilizará una ruta diferente para completar el nombre del archivo. Pero, ¿cómo puedo verificar si existe el nodo Filename?

+0

Buena pregunta (+1). Consulte mi respuesta para obtener una explicación y una breve expresión única de XPath que selecciona el nombre del archivo o el valor predeterminado, en caso de que falte el nombre del archivo. :) –

Respuesta

14

Puede usar la función count - pasando por la ruta de los nodos que está comprobando.

Si no existen, entonces el valor de count será 0:

count(//Filename) = 0 
8

Supongamos que tenemos el siguiente documento XML:

<top> 
    <function> 
    <filenamex>c:\a\y\z\myFile.xml</filenamex> 
    <default>Default.xml</default> 
    </function> 
</top> 

entonces esta expresión XPath selecciona cualquiera el elemento filename cuando está presente o el elemento default cuando no se especifica ningún elemento filename:

(/*/function/filename 
| 
/*/function/default 
) 
    [1] 

El camino más corto para comprobar si existe el elemento filename es:

/*/function/filename

Así que la primera expresión XPath podría ser reescrita en el equivalente (pero algo más largo) :

/*/function/filename 
| 
/*/function/default[not(/*/function/filename)] 
12

Similar al recuento pero tal vez más directa en función de lo que quiere es la función booleana

boolean(//Filename)

Esto devuelve cierto si existe "Nombre de archivo" nodo y falsa si no.

+0

¿Es posible negar el resultado devuelto? Algo como '! boolean (...) '... – Aerendir

+0

Una intención algo críptica, ¿eh? –

5

Dado el ejemplo XML desde otra respuesta

<top> 
    <function> 
    <filenamex>c:\a\y\z\myFile.xml</filenamex> 
    <default>Default.xml</default> 
    </function> 
</top> 
  • Para obtener nodos con el nodo "filenamex" uso/superior/función [filenamex]
  • Para obtener nodos SIN nodo "filenamex" uso/top/función [no (filenamex)]

me sentí necesario responder aquí como las otras respuestas no funcionaron como se anuncia en XMLSPY

Cuestiones relacionadas