2012-07-13 66 views
3

如果我的標題聽起來令人困惑,那麼我很抱歉。 我正在寫一個比較2個XML文件的Python腳本。在這兩個文件中,我們都有數據,其id等於其他文件中的數據。比較兩個XML文件並在其中一箇中更新元素

E.g.

源文件:

<id>123456</id> 
    <data>blabla</data> 
     ......some other data...... 
    <id>abcde</id> 
    <data>gfkgjk</data> 
     ......some more data.......... 

目標文件:

<id>123456</id> 
    <data> </data> 
     ......some other data...... 
    <id>ghijk</id> 
    <data>gfkgjk</data> 
     ......some more data.......... 

正如你可以在上面的例子中,並非所有的ID是在源文件中也都在目標文件中看到。此外,儘管2個數據組具有相同的ID,但其中一個具有填寫的「數據」標籤,另一個沒有。

我的程序應該看看源文件,提取數據標記之間的id和文本。然後它會查看目標文件,如果存在具有相同ID和空數據標籤的數據(如上例所示),則會使用源文件中的信息填充這些空標籤。 (順便說一下:除了ID和數據信息之外,這兩個XML是完全不同的,因此我不能只保留源文件)。

對,我能夠提取數據標籤之間的ID和信息。 現在我正在嘗試編寫一個函數來比較ID,並且如果有的話替換空的數據信息。 但是,我不是很熟悉Python和函數,需要一些幫助。 這裏是我的函數看起來像:

def replace_empty_data(): 
    for x in xmlData_id_source: 
     if xmlData_id_source==xmlData_id_target: 
      target = re.sub(xmlData_2,xmlData,target) 
     return target 
    file_target.close() 

有可能會加載功能失蹤,但我不知道是什麼。它不會給我任何錯誤,而且根本不起作用。變量除了x已經在代碼的前面部分中定義,所以這不是問題。

xmlData_id_source是從源文件中的ID xmlData_id_target是從目標文件中的ID xmlData_2是從目標文件 XMLDATA的數據信息從源文件中的數據信息

感謝您的輸入,以便很遠,但我仍然在尋找一種易於理解的方法,用於對編程毫無頭緒的人......我使用minidom來解析文件,並且希望在不導入和安裝更多庫的情況下使用它。

回答

2

您需要爲此使用XML解析器。看看ElementTree

請勿在此處使用正則表達式或字符串替換

+0

我正在使用Minidom,它工作正常。剩下的唯一問題就是我在提取數據後如何編寫這個比較函數。 – Kaly 2012-07-13 13:47:41

1

我使用lxml,它具有良好的性能和額外的功能,例如內置的ElementTree不支持的XPATH。這是我會怎麼做:

>>> source = """<root> 
    <tag> 
     <id>123456</id> 
     <data>blabla</data> 
    </tag> 
    <tag> 
     <id>abcde</id> 
     <data>gfkgjk</data> 
    </tag> 
</root>""" 
>>> target = """<root> 
    <tag> 
     <id>123456</id> 
     <data> </data> 
    </tag> 
    <tag> 
     <id>ghijk</id> 
     <data>gfkgjk</data> 
    </tag> 
</root>""" 

由於data節點未在id一個封裝的,我認爲他們兩人都在tag一個,這是什麼地方下root。好吧,第1部分旨在獲得的id個字典及其相應的data

>>> root = etree.fromstring(source) 
>>> for tag in root.findall('tag'): 
    id_ = tag.find('id') 
    data = tag.find('data') 
    id_dict[id_.text] = data.text 


>>> id_dict 
{'123456': 'blabla', 'abcde': 'gfkgjk'} 

現在,更新的目標感謝這個字典:

>>> root = etree.fromstring(target) 
>>> for tag in root.findall('tag'): 
    id_ = tag.find('id') 
    data = tag.find('data') 
    if data.text.strip() == '': 
     data.text = id_dict[id_.text] 


>>> print etree.tostring(root) 
<root> 
    <tag> 
     <id>123456</id> 
     <data>blabla</data> 
    </tag> 
    <tag> 
     <id>ghijk</id> 
     <data>gfkgjk</data> 
    </tag> 
</root> 

你必須要適應這種解決辦法對你的真實XML結構,那應該很好!

+0

謝謝,這聽起來像一個方便的事情。我只是希望有一種方式可以使用Python內部工具,因爲代碼將在我公司內部分發給那些在運行程序之前不太熟悉安裝大量內容的人! Mhhh ......無論如何,都會試試看!謝謝:) – Kaly 2012-07-13 14:21:48

+0

那麼,ElementTree和lxml是類似的,因爲在這裏我使用了非常基本的功能('findall','find','.text' ...),所以您可以按原樣使用它,或者使用小適應努力。 – Emmanuel 2012-07-13 14:39:09

+0

我仍然試圖讓我的頭在這附近。我一直在試圖調整你的代碼到內置的etree,但是我的問題是我收到「id_dict」沒有定義的錯誤。是特定於lxml的id_dict [id_.text]的東西? – Kaly 2012-07-16 12:28:14

相關問題