2012-12-04 34 views
9

मैं CDATA के ब्लॉक की एक संख्या है कि मैं बाद में की साजिश रचने के लिए बनाए रखने की आवश्यकता के साथ एक एक्सएमएल फ़ाइल को पार्स करने की जरूरत के साथ एक्सएमएल में:पार्सिंग CDATA अजगर

<process id="process1"> <log name="name1" device="device1"><![CDATA[timestamp value]]]></log> <log name="name2" device="device2"><![CDATA[timestamp value, timestamp value, timestamp]]]></log> </process>

मैं इस बार-बार और जल्दी से करने की आवश्यकता होगी , और मैं ऐसा करने का सबसे अच्छा तरीका ढूंढ रहा हूं। मैंने पढ़ा है कि ElementTree विधियों का तेज़ है, लेकिन मैं अन्य सुझावों के लिए खुला हूं।

+0

xtree तत्व पेड़ से आपकी समस्या के लिए एक और वैकल्पिक है। – Rajendra

उत्तर

10

यहाँ यह कैसे करना है के दो उदाहरण हैं:

from lxml import etree 
import xml.etree.ElementTree as ElementTree 

CONTENT = """ 
<process id="process1"> 
<log name="name1" device="device1"><![CDATA[timestamp value]]></log> 
<log name="name2" device="device2"><![CDATA[timestamp value, timestamp value, timestamp]]></log> 
</process> 
""" 

def parse_with_lxml(): 
    root = etree.fromstring(CONTENT) 
    for log in root.xpath("//log"): 
     print log.text 

def parse_with_stdlib(): 
    root = ElementTree.fromstring(CONTENT) 
    for log in root.iter('log'): 
     print log.text 

if __name__ == '__main__': 
    parse_with_lxml() 
    parse_with_stdlib() 

आउटपुट:

timestamp value 
timestamp value, timestamp value, timestamp 
timestamp value 
timestamp value, timestamp value, timestamp 

पाठ विशेषता यह दोनों ही मामलों में यह संभालती है।

+1

प्रदर्शन के लिए, 'cElementTree' का उपयोग किया जा सकता है (नोट: लीडइंड 'सी') – jfs

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^