2011-12-31 36 views
9

Làm thế nào tôi có thể tìm thấy trong XPath 1.0 tất cả các hàng có rỗng col name="POW"?XPath: chọn thẻ có giá trị rỗng

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

Tôi đã thử nhiều giải pháp. Một vài lần trong phần mở rộng của XPath XPath Checker selection là ok, nhưng lxml.xpath() nói rằng biểu thức không hợp lệ hoặc chỉ trả về không có hàng. đang

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

Trả lời

7

Làm thế nào tôi có thể tìm thấy trong XPath 1.0 tất cả các hàng có rỗng col name="POW"?

Có nhiều định nghĩa có thể có về "trống" và cho mỗi một trong số chúng có biểu thức XPath khác nhau chọn các phần tử "trống".

Định nghĩa hợp lý cho phần tử trống là: phần tử không có phần tử con và không có nút con văn bản hoặc phần tử có một nút con văn bản, có giá trị chuỗi chỉ chứa các ký tự khoảng trắng.

biểu hiện này XPath:

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

chọn tất cả row yếu tố trong tài liệu XML, rằng có một đứa con col, có một thuộc tính name với giá trị chuỗi "POW" và rằng không có trẻ em - các yếu tố và có giá trị chuỗi bao gồm toàn bộ các ký tự khoảng trắng hoặc là chuỗi rỗng.

Trong trường hợp của "trống rỗng" bạn hiểu "không có trẻ em ở tất cả các", có nghĩa là không có yếu tố trẻ em và không có các nút con PI và không có con bình luận nút, sau đó sử dụng:

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

Sử dụng này:

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

Có là không cần thiết ')]' ở cuối biểu thức ... Và nó chọn tất cả các hàng trong mã của tôi (trong XPath Checker mọi thứ đều ổn). Tôi đã cập nhật câu hỏi của mình ... – pbm

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

Để đảm bảo rằng các cột POW cũng không có bất kỳ yếu tố con (ngay cả khi chúng không chứa bất kỳ văn bản nào), sau đó thêm bộ lọc biến vị ngữ bổ sung:

//row[col[@name='POW' and not(normalize-space()) and not(*)]] 
Các vấn đề liên quan