2011-09-07 22 views
5

Tôi có mã Python để phân tích cú pháp một tệp XML là detailed here. Tôi hiểu rằng các tập tin XML là khét tiếng cho các tài nguyên hệ thống hogging khi thao tác trong bộ nhớ. Giải pháp của tôi hoạt động cho các tệp XML nhỏ hơn (nói 200KB và tôi có tệp 340MB).Cách tách một tệp XML theo cách đơn giản trong Python?

Tôi bắt đầu nghiên cứu triển khai StAX (kéo phân tích cú pháp) nhưng tôi đang chạy đúng lịch và tôi đang tìm cách tiếp cận đơn giản hơn nhiều cho tác vụ này.

Tôi hiểu việc tạo các đoạn tệp nhỏ hơn nhưng làm cách nào để trích xuất các phần tử phù hợp bằng cách xuất các thẻ chính/tiêu đề mỗi lần?

Ví dụ, đây là sơ đồ:

<?xml version="1.0" ?> 
<!--Sample XML Document--> 
<bookstore> 
    <book Id="1"> 
     .... 
     .... 
    </book> 
    <book Id="2"> 
     .... 
     .... 
    </book> 
    <book Id="3"> 
     .... 
     .... 
    </book> 
    .... 
    .... 
    .... 
    <book Id="n"> 
     .... 
     .... 
    </book> 
</bookstore> 

Làm thế nào để tạo ra các file XML mới với dữ liệu tiêu đề cho mỗi 1000 yếu tố cuốn sách? Để có ví dụ cụ thể về mã và tập dữ liệu, vui lòng tham khảo question here khác của tôi. Cảm ơn rất nhiều.

Tất cả những gì tôi muốn làm là tránh tải bộ nhớ trong bộ nhớ cùng một lúc. Chúng tôi có thể phân tích cú pháp tệp XML theo kiểu truyền trực tuyến không? Tôi có đang suy nghĩ dọc theo đường thẳng không?

p.s: Tình huống của tôi tương tự như question asked vào năm 2009. Sẽ đăng câu trả lời ở đây khi tôi tìm thấy giải pháp đơn giản hơn cho vấn đề của mình. Phản hồi của bạn được đánh giá cao.

Trả lời

8

Bạn có thể parse your big XML file incrementally:

from xml.etree.cElementTree import iterparse 

# get an iterable and turn it into an iterator 
context = iter(iterparse("path/to/big.xml", events=("start", "end"))) 

# get the root element 
event, root = next(context) 
assert event == "start" 

for event, elem in context: 
    if event == "end" and elem.tag == "book": 
     # ... process book elements ... 
     root.clear() 
2

Bạn có thể sử dụng elementtree.iterparse và hủy từng thẻ sách sau khi được xử lý.

+1

Vẫn còn tốt hơn, etree sử dụng lxml của (http://lxml.de/tutorial.html) cho một tăng hiệu suất. – six8

+1

@Cixate: không rõ ràng (không có điểm chuẩn) cho dù 'cElementTree.iterparse()' chậm hơn 'lxml.etree.iterparse()' khi chỉ phân tích cú pháp là bắt buộc http://www.ibm.com/developerworks/xml/library/x-hiperfparse / – jfs

Các vấn đề liên quan