2011-09-07 113 views
5

我有解析XML文件的Python代碼爲detailed here。我知道XML文件在內存中操作時會佔用系統資源。我的解決方案適用於較小的XML文件(比如說200KB,我有一個340MB的文件)。如何在Python中以簡單的方式拆分XML文件?

我開始研究StAX(pull語法分析器)的實現,但是我的計劃很緊,我正在尋找一個更簡單的方法來完成這個任務。

我瞭解創建更小的文件塊,但是如何通過每次輸出主/標籤來提取正確的元素?

例如,這是模式:

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

如何創建每1000項本書內容與標題數據新的XML文件?有關代碼和數據集的具體示例,請參閱我的其他question here。非常感謝。

我想要做的就是避免一次全部加載數據集的內存。我們能否以流媒體的方式解析XML文件?我是否正確地思考?

p.s:我的情況類似於2009年的question asked。一旦我找到一個更簡單的解決方案來解決我的問題,我會在這裏發佈答案。感謝您的反饋。

回答

8

您可以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

您可以使用elementtree.iterparse,並在處理每個書籤後丟棄它。

+1

更妙的是,使用LXML的etree(http://lxml.de/tutorial.html)的性能提升。 – six8

+1

@Cixate:當只需要解析時,不清楚(沒有基準)cElementTree.iterparse()是否比'lxml.etree.iterparse()'慢。http://www.ibm.com/developerworks/xml /庫/ X-hiperfparse / – jfs