【问题标题】:use a dictionary to change element text in xml使用字典更改 xml 中的元素文本
【发布时间】: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


    【解决方案1】:

    我认为遍历tree 并查看每个logical_devid 是否在d 中会更有意义。一旦你在变量中拥有logical_devid(比如old_devid),那么:

    new_devid = d.get(old_devid)
    

    会看看你是否有替代品。如果new_devid is null 不在字典中。否则,new_devid 应替换树中 logical_devid 的当前值。

    【讨论】:

    • 谢谢,这很有意义。
    猜你喜欢
    • 2017-07-30
    • 2018-02-13
    • 2013-03-06
    • 2021-10-08
    • 2019-05-20
    • 1970-01-01
    • 2015-08-18
    • 2014-05-25
    • 2013-04-03
    相关资源
    最近更新 更多