2012-12-04 40 views
9

tôi cần phải phân tích một tập tin XML với một số khối CDATA rằng tôi cần phải giữ lại cho sau này âm mưu:Parsing CDATA trong xml với python

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

tôi sẽ cần phải làm điều này nhiều lần và nhanh chóng và tôi đang tìm cách tốt nhất để làm điều này. Tôi đã đọc rằng ElementTree là nhanh hơn của các phương pháp, nhưng tôi mở cho các đề xuất khác.

+0

xtree là một thay thế khác cho vấn đề của bạn tốt hơn so với cây phần tử. – Rajendra

Trả lời

10

Dưới đây là hai ví dụ về làm thế nào để làm điều đó:

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

Output:

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

Văn bản thuộc tính nó xử lý nó trong cả hai trường hợp.

+1

Để thực hiện, 'cElementTree' có thể được sử dụng (lưu ý: leadind' c') – jfs