XPath: 选择值为空的标签

10 投票
3 回答
16633 浏览
提问于 2025-04-17 09:19

我该如何在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 个回答

1

使用这个:

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

为了确保POW这一列里也没有任何子元素(即使这些子元素里面没有文字),你可以添加一个额外的条件过滤器:

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

我怎么用XPath 1.0找到所有空的col name="POW"行呢?

关于“空”的定义有很多种,每种定义对应着不同的XPath表达式来选择“空”的元素。

一个合理的“空”元素定义是:一个元素没有子元素,也没有文本节点,或者它有一个文本节点,但这个文本节点的内容只包含空格。

这个XPath表达式

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

会选择XML文档中所有的row元素,这些元素有一个col子元素,且这个子元素的属性name的值是"POW",并且没有任何子元素,或者它的内容完全是空格,或者是空字符串。

如果你理解的“空”是“完全没有子元素”,也就是说没有子元素、没有子处理指令节点,也没有子注释节点,那么可以使用:

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

撰写回答