2009-05-01 16 views
18

Mi XPath es un poco oxidado ... Digamos que tengo este simple archivo XML:Cómo filtrar con XPath en todos los elementos sin un atributo específico

<?xml version="1.0" encoding="utf-8" ?> 
<States xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<States> 
<StateProvince name="ALABAMA" abbrev="AL" /> 
.... 
<StateProvince name="AMERICAN SAMOA" abbrev="AS" territory="true" /> 
</States> 
</States> 

me gustaría ejecutar una consulta XPath simples para analizar todos los estados verdaderos (por lo tanto, no inserte en estados donde territorio = verdadero). Intenté \ StateProvince [@territory! = 'True'] pero obtuve cero. Otras variaciones parecen estar fallando. Parece que debería ser simple, pero no encuentra lo que quiero.

Cualquier ayuda apreciada.

+0

Especialmente si es nuevo en XPath, debe tener en cuenta las consideraciones planteadas en mi solución: se debe evitar la // abreviación siempre que sea posible, ya que hace que se escanee todo el documento (subárbol enraizado en el nodo de contexto) . –

+0

Incluso para documentos XML pequeños que usan '//' pueden afectar terriblemente el rendimiento (si estas expresiones XPath se emiten con frecuencia). Además, si uno se acostumbra a '//' con documentos pequeños, entonces hay grandes posibilidades de que lo olvide y lo use con documentos más grandes y así crear un desastre de rendimiento. Después de todo, ¿quién decide qué tan pequeño es "pequeño" y dónde deja de ser "pequeño"? –

Respuesta

30

expresión Uno de XPath que selecciona los elementos deseados:

                /*/States/StateProvince[not(@territory='true')]

hacer la nota que hay que evitar la abreviatura // siempre que sea posible, ya que causa todo el documento (subárbol con raíz en el nodo de contexto) a escanear.

La expresión XPath anteriormente evita el uso de la//abreviatura teniendo en cuenta la estructura del documento XML proporcionado originalmente.

Sólo si la estructura del documento XML es completamente desconocida (y la expresión XPath está destinado a ser utilizado al otro lado de muchos documentos XML con estructura desconocida) se debe al uso de la // abreviatura considerarse.

+0

Acepto que esto también es una buena práctica, pero en mi caso es solo un pequeño archivo XML que se almacenará en caché una vez que se haya cargado. – lyngbym

+0

@lyngbym Incluso para documentos XML pequeños que usan '//' pueden afectar terriblemente el rendimiento (si estas expresiones XPath se emiten con frecuencia). Además, si uno se acostumbra a '//' con documentos pequeños, entonces hay grandes posibilidades de que lo olvide y lo use con documentos más grandes y así crear un desastre de rendimiento. Después de todo, ¿quién decide qué tan pequeño es "pequeño" y dónde deja de ser "pequeño"? –

6

Se están muy cerca:

//StateProvince[not(@territory) or @territory != 'true'] 

que debe obtener el resultado deseado.

2

Esto debería funcionar:

//StateProvince[not(@territory='true')] 
Cuestiones relacionadas