2015-02-11 35 views
0

我正在嘗試對xml文件進行可變性研究。下面顯示了一個示例代碼。在創建XML文件的不同版本時僅編輯和更新XML文件中的數字文本

<data> 
<country name="Liechtenstein"> 
    <rank updated="yes">2</rank> 
    <currency>1.21$/kg</currency> 
    <gdppc>141100</gdppc> 
    <neighbor name="Austria" direction="E"/> 
    <neighbor name="Switzerland" direction="W"/> 
</country> 
<country name="Singapore"> 
    <rank updated="yes">5</rank> 
    <currency>4.1$/kg</currency> 
    <gdppc>59900</gdppc> 
    <neighbor name="Malaysia" direction="N"/> 
</country> 

我想動態地改變(比如乘以1.5)xml中所有數字值的每個文本,例如, > 2 <或> 141100 <或和NOT> 1.21 $/kg <或>> 4.1 $/kg < <。我需要將每個文本變體另存爲一個不同的xml文件(例如,當我將列支敦士登的等級更改爲3時,將xml文件另存爲LiechtensteinRank1.5)。

我的目標是轉換每個文本輸入並保存每個更改的所有版本,然後在一起批處理後一起運行xml文件。 xml是相對較深的嵌套200,000行和多達10個不同的子節點。

我只能提取文本如下。

import xml.etree.ElementTree as ET 
tree = ET.parse("Ywepr.xml") 
root = tree.getroot() 
for text in root.itertext(): 
    print repr(text) 
charlie = file.writelines(root.itertext()) 

歡迎任何建議。謝謝

回答

0

在我看來,你需要做一個遍歷的樹爲了做到這一點。原因是您需要實際更新XML元素的文本以使輸出正確。

要遍歷etree的節點,你需要使用Element.getchildren()。這將返回此元素的所有子元素的列表。因爲英文描述非常粗糙,所以我打算直接啓動代碼。

def traversal(elem): 
    text = elem.text 
    # do work here 

    for node in elem.getchildren(): 
     traversal(node) 

這是一個非常經典的遞歸解決方案,以樹的遍歷,在這裏您可以通過節點去節點,做的工作和來訪的所有子節點。最終,你最終會拜訪他們。請注意,這個解決方案需要你的XML數據適合內存,但似乎你已經加載了它,所以你應該在這裏保持良好狀態。

我也應該觸及你需要做什麼才能做你的文字匹配。如果您的條件與「所有數字」一樣簡單,我建議使用正則表達式。我希望下面的內容足以讓你開始。

import re 
digitsRegex = re.compile(r'\d+$') 
digitsRegex.match('12345')