python XML查找并替换

时间:2016-09-08 12:38:03

标签: python xml

与python / etree战斗一天后没有取得相当大的成功:

我有一个xml文件(items.xml)

<symbols>
    <symbol>
        <layer class="SvgMarker">
            <prop k="size" v="6.89"/>
        </layer>
    </symbol>
    <symbol>
        <layer class="SvgMarker">
            <prop k="size" v="3.56"/>
        </layer>
    </symbol>
    <symbol>
        <layer class="line">
            <prop k="size" v="1"/>
        </layer>
    </symbol>            
</symbols>

问题

  1. 阅读此文件
  2. 找到所有具有父元素namend&#34; layer&#34;的prop元素与班级&#34; SvgMarker&#34;
  3. 将v的值乘以1.5
  4. 写回内容
  5. 如果有更容易的话,我不会坚持使用etree。

2 个答案:

答案 0 :(得分:1)

这会对你有所帮助

import xml.etree.ElementTree as ET

tree = ET.parse('items.xml') # Path to input file
root = tree.getroot()

for prop in root.iter('.//*[@class="SvgMarker"]/prop'):
   prop.set('v', str(float(prop.get('v')) * 1.5))

tree.write('out.xml', encoding="UTF-8")

参考:https://docs.python.org/2/library/xml.etree.elementtree.html#example

答案 1 :(得分:0)

您需要处理xml标记中的层次结构及其类型转换以执行乘法。我用你的xml测试了下面的代码,它运行正常。

import xml.etree.ElementTree as ET
tree = ET.parse('homemade.xml')                 #Step 1
root = tree.getroot()
for symbol in tree.findall('symbol'):
    for layer in symbol.findall('layer'):
        class_ = layer.get('class')
        if(class_=="SvgMarker"):                #Step 2
            for prop in layer.findall('prop'):
                new_v = prop.get('v')
                new_v = float(new_v)*1.5        #Step 3
                prop.set('v',str(new_v))
outFile = open('homemade.xml', 'w')
tree.write(outFile)                             #Step 4

希望这有帮助。