2011-12-31 34 views
9

¿Cómo puedo encontrar en XPath 1.0 todas las filas con col name="POW" vacío?XPath: seleccione la etiqueta con el valor vacío

<row> 
<col name="WOJ">02</col> 
<col name="POW"/> 
<col name="GMI"/> 
<col name="RODZ"/> 
<col name="NAZWA">DOLNOŚLĄSKIE</col> 
<col name="NAZDOD">województwo</col> 
<col name="STAN_NA">2011-01-01</col> 
</row> 

He intentado muchas soluciones. Pocas veces en la extensión de Firefox, la selección de XPath Checker estaba bien, pero lxml.xpath() dice que la expresión no es válida o simplemente no devuelve filas. código

Mi Python:

from lxml import html 
f = open('TERC.xml', 'r') 
page = html.fromstring(f.read()) 
for r in page.xpath("//row[col[@name = 'POW' and not(text())]]"): 
    print r.text_content() 
    print "-------------------------" 

Respuesta

7

¿Cómo puedo encontrar en XPath 1.0 todas las filas con col name="POW" vacío?

Existen muchas definiciones posibles de "vacío" y para cada una de ellas hay una expresión XPath diferente que selecciona elementos "vacíos".

Una definición razonable para un elemento vacío es: un elemento que no tiene elementos secundarios ni elementos secundarios de texto o un elemento que tiene un elemento secundario de texto único cuyo valor de cadena contiene solo espacios en blanco.

Esta expresión XPath:

//row[col[@name = 'POW'] 
        [not(*)] 
         [not(normalize-space())] 
     ] 

selecciona todos row elementos del documento XML, que tienen un niño col, que tiene un atributo name con valor de cadena "POW" y que no tiene hijos - elementos y cuya el valor de cadena consiste completamente en caracteres de espacios en blanco, o es la cadena vacía.

En el caso de "vacío" se entiende "no tener hijos en todo", lo que significa que no hay elementos secundarios y no hay nodos hijos PI y no tiene hijos comentan los nodos, a continuación, utilizar:

//row[col[@name = 'POW'] 
        [not(node())] 
     ] 
1

Utilice esta:

//row[col[@name = 'POW' and not(text())]] 
+0

No es innecesaria ')]' al final de la expresión ... Y selecciona todas las filas en mi código (en XPath Checker todo está bien). Actualicé mi pregunta ... – pbm

3
//row[col[@name='POW' and not(normalize-space())]] 

Para asegurar que la columna de prisioneros de guerra también no tiene ningún elementos secundarios (incluso si no contienen cualquier texto), luego agregue un filtro de predicado adicional:

//row[col[@name='POW' and not(normalize-space()) and not(*)]] 
Cuestiones relacionadas