簡體   English   中英

使用lxml修改大型xml文件

[英]Modify large xml file using lxml

語言:-Python 2.7.6

檔案大小:-1.5 GB

XML格式

<myfeed>
    <product>
        <id>876543</id>
        <name>ABC</name>
        ....
     </product>

    <product>
        <id>876567</id>
        <name>DEF</name>
        ....
     </product>

    <product>
        <id>986543</id>
        <name>XYZ</name>
        ....
     </product>

我必須

A)讀取所有節點<product>

B)刪除其中一些節點(如果<id>屬性的文本在python set()中

C)更新/更改幾個節點(如果<id>屬性的文本在python dict中

D)追加/寫入一些新節點

問題是我的XML文件很大(大約1.5 GB)。 我進行了一些研究,並決定將lxml用於所有這些目的。

我正在嘗試將iterparse()與element.clear()配合使用,因為它不會消耗我的所有內存。

for event, element in etree.iterparse(big_xml_file,tag = 'product'):
        for child in element:
            if child.tag == unique_tag:
                if child.text in products_id_hash_set_to_delete: #python set()
                    #delete this element node

                else:
                    if child.text in products_dict_to_update:
                        #update this element node  
                        else:
                            print child.text
        element.clear()

注意:-我想一次掃描XML文件來完成所有這4個任務

問題

1)我可以一次掃描文件來實現所有這些功能嗎?

2)如果是,如何刪除和更新我正在處理的元素節點?

3)我應該改用tree.xpath()嗎? 如果是,則將為1.5 GB的文件消耗多少內存,或者它與iterparse()的工作方式相同

我對python不太有經驗。 我來自Java背景。

您不能就地編輯XML文件。 您必須將輸出寫入新的(臨時)文件,然后用新文件替換原始文件。

因此,基本算法是:

  • 循環遍歷所有元素。
  • 如果該節點是要刪除的節點,則繼續下一個元素
  • 如果該節點是要更改的節點,請更改其值
  • 寫出節點«««這是您缺少的關鍵點
  • 當您要完成對作為新節點之一的父節點的節點的處理時,請寫出新節點,並將其從新節點集合中刪除。
  • 關閉輸出文件
  • 改名。

要回答補充問題:您需要認識到XML文件是一個(長)字符串。 如果要插入一個字符,則必須將其他所有字符都洗牌; 如果要刪除一個字符,則必須將其他所有字符都洗掉。 您不能使用文件來執行此操作; 您不能只是從文件中間刪除字符。

如果您有數百萬個元素(這是一個實際的問題,而不是一個類的練習),那么您需要使用數據庫。 當有人說“數據庫”時,我首先想到了SQLite,但是正如Charles Duffy在下面指出的那樣,如果您已經有了XML,那么XQuery數據庫可能是一個更好的起點。 有關某些開源實現,請參見BaseX或eXist。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM