2016-07-18 80 views
0

我有一個使用XML有一組數據,看起來像這樣一個RESX文件:如何在Python中編輯XML文件?

<data name="key_first" xml:space="preserve"> 
    <value>Text 1</value> 
</data> 
<data name="key_second" xml:space="preserve"> 
    <value>Text 2</value> 
</data> 
<data name="key_third" xml:space="preserve"> 
    <value>Text 3</value> 
</data> 

其中名稱值都有一個詞(如:「鑰匙」)。我想在Python中做的是將這個'data'名稱值(「key +任何後面的內容」)添加到'value'文本中,然後保存新文件,但我對XML/Python世界,我有點失落。我希望它看起來像這樣:

<data name="key_first" xml:space="preserve"> 
    <value>[key_first] Text 1</value> 
</data> 
<data name="key_second" xml:space="preserve"> 
    <value>[key_second] Text 2</value> 
</data> 
<data name="key_third" xml:space="preserve"> 
    <value>[key_third] Text 3</value> 
</data> 

我該怎麼做?我應該使用minidom還是Element Tree?

+0

從技術上講,任何XML解析器將做的工作 - 你可以使用SAX解析器FWIW - ,但從來沒有人被解僱了選擇的ElementTree。 –

+0

就個人而言,我會使用XSLT的lxml,並在需要時添加自定義回調函數。 – o11c

回答

1

哪個XML解析器的選擇是你的,但這裏是你如何可以xml.etree.ElementTree處理這個問題:這個想法是迭代在所有data節點上,從.attrib字典獲取name屬性值,找到value元素並適當設置.text

import xml.etree.ElementTree as ET 

data = """<parent> 
    <data name="key_first" xml:space="preserve"> 
     <value>Text 1</value> 
    </data> 
    <data name="key_second" xml:space="preserve"> 
     <value>Text 2</value> 
    </data> 
    <data name="key_third" xml:space="preserve"> 
     <value>Text 3</value> 
    </data> 
</parent>""" 

tree = ET.fromstring(data) 

for data in tree.findall("data"): 
    name = data.attrib["name"] 
    value = data.find("value") 
    value.text = "[%s] %s" % (name, value.text) 

print(ET.tostring(tree)) 

打印:

<parent> 
    <data name="key_first" xml:space="preserve"> 
     <value>[key_first] Text 1</value> 
    </data> 
    <data name="key_second" xml:space="preserve"> 
     <value>[key_second] Text 2</value> 
    </data> 
    <data name="key_third" xml:space="preserve"> 
     <value>[key_third] Text 3</value> 
    </data> 
</parent> 
+0

完美的作品;謝謝! – Mariankka