2009-09-11 18 views
23

मैं एक XML संरचना निम्न की तरह लग रहा है से अधिक पुनरावृत्ति है, लेकिन एक बहुत बड़े पैमाने पर:अजगर minidom का उपयोग कर एक्सएमएल पढ़ना और प्रत्येक नोड

:

<root> 
    <conference name='1'> 
     <author> 
      Bob 
     </author> 
     <author> 
      Nigel 
     </author> 
    </conference> 
    <conference name='2'> 
     <author> 
      Alice 
     </author> 
     <author> 
      Mary 
     </author> 
    </conference> 
</root> 

इस के लिए, मैं निम्नलिखित कोड का इस्तेमाल किया

dom = parse(filepath) 
conference=dom.getElementsByTagName('conference') 
for node in conference: 
    conf_name=node.getAttribute('name') 
    print conf_name 
    alist=node.getElementsByTagName('author') 
    for a in alist: 
     authortext= a.nodeValue 
     print authortext 

हालांकि, मुद्रित लेखांकन जो 'कोई नहीं' है। मैंने नीचे की तरह भिन्नताओं का उपयोग करने के साथ गड़बड़ करने की कोशिश की, लेकिन यह मेरे प्रोग्राम को तोड़ने का कारण बनता है।

authortext=a[0].nodeValue 

सही उत्पादन किया जाना चाहिए:

1 
Bob 
Nigel 
2 
Alice 
Mary 

लेकिन क्या मैं मिलता है:

1 
None 
None 
2 
None 
None 

कि इस समस्या से निपटने के लिए पर कोई सुझाव?

उत्तर

23

आपके authortext प्रकार 1 (ELEMENT_NODE) है, आमतौर पर आपको स्ट्रिंग प्राप्त करने के लिए TEXT_NODE होना चाहिए। यह

a.childNodes[0].nodeValue 
0

मैं थोड़ा इसके साथ चारों ओर निभाई है, और यहाँ मैं क्या काम मिल गया है:

# ... 
authortext= a.childNodes[0].nodeValue 
print authortext 

के उत्पादन को प्रेरित किया:

 
C:\temp\py>xml2.py 
1 
Bob 
Nigel 
2 
Alice 
Mary 

मैं तुम्हें नहीं बता सकते तुम क्यों करने के लिए है आंतरिक पाठ प्राप्त करने के लिए बच्चे नोड तक पहुंचें, लेकिन कम से कम यही वह है जिसे आप ढूंढ रहे थे।

6

एलिमेंट नोड्स में नोड वैल्यू नहीं होगा। आपको उनके अंदर टेक्स्ट नोड्स देखना होगा। यदि आप जानते हैं कि आपके अंदर हमेशा एक टेक्स्ट नोड होता है तो आप element.firstChild.data कह सकते हैं (डेटा टेक्स्ट नोड्स के लिए नोडवेल्यू जैसा ही है)।

सावधान रहें: यदि कोई टेक्स्ट सामग्री नहीं है तो कोई बच्चा टेक्स्ट नोड्स और element.firstChild शून्य नहीं होगा, जिससे .data विफल होने तक पहुंच होगी।

प्रत्यक्ष बच्चे पाठ नोड्स की सामग्री प्राप्त करने के लिए त्वरित तरीका:

text= ''.join(child.data for child in element.childNodes if child.nodeType==child.TEXT_NODE) 

डोम स्तर 3 कोर में आप textContent संपत्ति आप एक तत्व रिकर्सिवली अंदर से पाठ प्राप्त करने के लिए उपयोग कर सकते हैं मिलता है, लेकिन minidom नहीं है इसका समर्थन करें (कुछ अन्य पायथन डीओएम कार्यान्वयन करते हैं)।

2

त्वरित पहुंच:

node.getElementsByTagName('author')[0].childNodes[0].nodeValue 
0

आप हमेशा आप element.firstChild.data

dom = parseString(document) 
conferences = dom.getElementsByTagName("conference") 

# Each conference here is a node 
for conference in conferences: 
    conference_name = conference.getAttribute("name") 
    print 
    print conference_name.upper() + " - " 

    authors = conference.getElementsByTagName("author") 
    for author in authors: 
     print " ", author.firstChild.data 
    # for 

    print 
उपयोग कर सकते हैं लेखक प्रति एक पाठ डेटा मान है के बाद से
संबंधित मुद्दे