2011-12-31 10 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> 

मैंने कई समाधानों की कोशिश की। फ़ायरफ़ॉक्स एक्सटेंशन में कुछ बार XPath परीक्षक चयन ठीक था, लेकिन lxml.xpath() कहता है कि अभिव्यक्ति अमान्य है या केवल कोई पंक्ति नहीं लौटाती है।

मेरे अजगर कोड:

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 बच्चे का चयन करता है, स्ट्रिंग मान "POW" साथ एक विशेषता name है और कि कोई बच्चे नहीं है कि - तत्वों और जिसका स्ट्रिंग मान या तो पूरी तरह से व्हाइटस्पेस वर्णों के होते हैं, या खाली स्ट्रिंग है।

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

उपयोग करें:

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

वहाँ अनावश्यक है:

"खाली" आप समझ "सभी में कोई संतानों की" है, जो कोई बच्चे तत्वों और कोई संतान नहीं पीआई नोड्स और कोई बच्चे नोड्स टिप्पणी है, तो का उपयोग भी तरह से मामले में

')] 'अभिव्यक्ति के अंत में ... और यह मेरे कोड में सभी पंक्तियों का चयन करता है (XPath परीक्षक में सबकुछ ठीक है)। मैंने अपना प्रश्न अपडेट किया ... – pbm

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

यह सुनिश्चित करने के पाउ स्तंभ भी किसी भी बच्चे तत्व नहीं (भले ही वे शामिल नहीं है कोई भी पाठ), फिर एक अतिरिक्त अनुमान फ़िल्टर जोड़ें:

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