【发布时间】:2013-06-16 02:09:39
【问题描述】:
我正在尝试学习 python,同时也为自己节省了很多工作。
我有一个 xml 文件和一个将旧设备 ID 映射到新设备 ID 的字典文件。
我正在尝试遍历树并为与字典键匹配的任何logical_devid 子项或为每个字典键找到相应的logical_devid。在任何一种情况下,将logical_devid.text 替换为新值。
例如xml sn-p
<lun>
<pseudo_dev>emcpower146a</pseudo_dev>
<udev>0x12b00000490</udev>
<product_id>symmetrix</product_id>
<frame_id>000192604705</frame_id>
<logical_devid_type>symm_id</logical_devid_type>
<logical_devid>0A43</logical_devid>
</lun>
文本文件
0A40 0127
0A41 0128
0A42 0129
0A43 012A
我已将 xml 文件作为 ElementTree 对象加载,并将文本文件加载到字典中。
import xml.etree.cElementTree as ET
tree = ET.ElementTree(file='emcpower.mappings')
d = {}
with open("translate-table.txt") as f:
for line in f:
(old, new) = line.split()
d[(old)] = new
我一直在试图找出迭代和替换 elem.text 的最佳方法 我认为最好的方法是遍历字典中的已知更改。
for old_devid, new_devid in d.iteritems():
然后为与 old_devid 匹配的 childlogical_devid 执行某种 xml 查找,将 elem.text 设置为 new_devid
这是我想要的完整脚本:
#!/usr/bin/python
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
#read in emcpower.mappings file as an entire xml tree of elements
tree = ET.ElementTree(file='emcpower.mappings')
# this defines a dictionary with the contents of the translate table which
# is simply the old device ID as key and new device id as value
d = {}
with open("translate-table.txt") as f:
for line in f:
(old, new) = line.split()
d[(old)] = new
for elem in tree.iterfind('lun/logical_devid'):
old_devid = elem.text
new_devid = d.get(old_devid)
try:
new_devid
except NameError:
new_devid = None
else:
if new_devid:
elem.text = new_devid
print "The logical_devid will be changed to", elem.text
tree.write('emcpower.mappings.new', )
【问题讨论】:
标签: python xml dictionary iteration