2011-12-31 78 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(*)]]