python - transitorio - XPath: seleccione la etiqueta con valor vacío
modelo transitorio odoo (3)
¿Cómo puedo encontrar en XPath 1.0 todas las filas con
col name="POW"
vacíocol name="POW"
?
Hay 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-nodo, o un elemento que tiene un elemento secundario de nodo de texto, cuyo valor de cadena contiene solo caracteres de espacios en blanco.
Esta expresión XPath :
//row[col[@name = ''POW'']
[not(*)]
[not(normalize-space())]
]
selecciona todos los elementos de row
en el documento XML, que tienen un col
child, que tiene un name
atributo con valor de cadena "POW"
y que no tiene elementos secundarios y cuyo valor de cadena consiste o bien en espacios en blanco, o es la cadena vacía.
En caso de "vacío", usted entiende "no tener ningún hijo" , lo que significa que no hay elementos secundarios y no hay hijos Nodos PI y no hay nodos de comentarios de los niños, luego use:
//row[col[@name = ''POW'']
[not(node())]
]
¿Cómo puedo encontrar en XPath 1.0 todas las filas con col name="POW"
vacío col name="POW"
?
<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>
Intenté 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.
Mi código de 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 "-------------------------"
Utilizar esta:
//row[col[@name = ''POW'' and not(text())]]
//row[col[@name=''POW'' and not(normalize-space())]]
Para asegurarse de que la columna POW tampoco tenga elementos secundarios (incluso si no contienen ningún texto), agregue un filtro de predicado adicional:
//row[col[@name=''POW'' and not(normalize-space()) and not(*)]]