vistas transitorio modelo estructura diccionario datos campos calculados python xml xpath lxml

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ío col 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(*)]]