2011-12-31 103 views
9

如何在XPath 1.0中找到空行col name="POW"的所有行?XPath:选择具有空值的标记

<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 "-------------------------" 

回答

7

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

“空”有很多可能的定义,每个人都有一个不同的XPath表达式选择“空”元素。

空元素的合理定义是:没有子元素且没有文本节点子元素的元素,或具有单个文本节点子元素的元素,其字符串值仅包含空白字符。

这个XPath表达式

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

选择XML文档中的所有row要素,即有col孩子,有一个属性name与字符串值"POW"和没有孩子的 - 元素和其字符串值完全由空白字符组成,或者是空字符串。

如果由“空”你懂的“没有孩子都”,这意味着没有孩子的元素和没有孩子PI节点,没有孩子注释节点,然后使用:

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

使用此:

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

有必要')]'在表达式结尾......并选择我的代码中的所有行(在XPath Checker中一切正常)。我更新了我的问题... – pbm 2011-12-31 13:07:45

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

为了确保POW列也没有任何子元素(即使它们不包含任何文本),然后添加一个额外的谓词过滤器:

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