XPath:选择空值标签

10

如何在XPath 1.0中查找所有带有空的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>

我尝试了许多解决方案。在Firefox扩展程序XPath Checker中,选择器几次是正常的,但是lxml.xpath()却说表达式无效或者返回零行。

我的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 "-------------------------"
3个回答

12

我如何在XPath 1.0中找到所有col name="POW"为空的行?

"空"有许多可能的定义,对于每个定义,都有不同的XPath表达式可以选择“空”元素。

一个合理的空元素定义是:没有子元素和文本节点子元素的元素,或者只有一个文本节点子元素,其字符串值仅包含空格字符。

这个XPath表达式

//row[col[@name = 'POW']
                    [not(*)]
                       [not(normalize-space())]
      ]
选取 XML 文档中所有具有 col 子元素的 row 元素,该 col 元素具有名为 "POW" 的字符串值的属性,并且该 col 元素没有任何子元素(即元素、PI 或注释节点),其字符串值仅由空格字符组成或为空字符串。 如果您将“空”解释为“根本没有子元素”,这意味着没有子元素元素、处理指令节点和注释节点,则使用以下内容:
//row[col[@name = 'POW']
                    [not(node())]
      ]

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

为了确保POW列也没有任何子元素(即使它们不包含任何文本),请添加一个额外的谓词过滤器:
//row[col[@name='POW' and not(normalize-space()) and not(*)]]

1
使用这个:
//row[col[@name = 'POW' and not(text())]]

表达式末尾有不必要的 )] ... 并且它选择了我的代码中的所有行(在XPath Checker中一切正常)。我更新了我的问题... - pbm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接