使用Python/ElementTree在XML中插入节点
我需要遍历这个XML树,当某个值小于5的时候,就添加一个子元素。
比如说,这个XML可以修改成:
<?xml version="1.0" encoding="UTF-8"?>
<A value="45">
<B value="30">
<C value="10"/>
<C value ="20"/>
</B>
<B value="15">
<C value = "5" />
<C value = "10" />
</B>
</A>
这个XML。
<?xml version="1.0" encoding="UTF-8"?>
<A value="45">
<B value="30">
<C value="10"/>
<C value ="20"/>
</B>
<B value="15">
<C value = "5"><D name="error"/></C>
<C value = "10" />
</B>
</A>
我该如何使用Python的ElementTree来实现这个呢?
2 个回答
2
ElementTree 的 iter 方法(对于 Python 版本低于 2.7 的用户,可以使用 getiterator)会递归地返回树中的所有节点。然后你只需要检查你的条件,并创建一个 SubElement:
from xml.etree import ElementTree as ET
tree = ET.parse(input)
for e in tree.getiterator():
if int(e.get('value')) < 5:
ET.SubElement(e,'D',dict(name='error'))
13
你可能打错字了,因为在这个例子中,一个错误元素被添加到了一个值为10的元素下面,而10并不小于5。不过我觉得这就是要表达的意思:
#!/usr/bin/env python
from xml.etree.ElementTree import fromstring, ElementTree, Element
def validate_node(elem):
for child in elem.getchildren():
validate_node(child)
value = child.attrib.get('value', '')
if not value.isdigit() or int(value) < 5:
child.append(Element('D', {'name': 'error'}))
if __name__ == '__main__':
import sys
xml = sys.stdin.read() # read XML from standard input
root = fromstring(xml) # parse into XML element tree
validate_node(root)
ElementTree(root).write(sys.stdout, encoding='utf-8')
# write resulting XML to standard output
给定这个输入:
<?xml version="1.0" encoding="UTF-8"?>
<A value="45">
<B value="30">
<C value="1"/>
<C value="20"/>
</B>
<B value="15">
<C value="5" />
<C value="10" />
<C value="foo" />
</B>
</A>
这是输出结果:
<A value="45">
<B value="30">
<C value="1"><D name="error" /></C>
<C value="20" />
</B>
<B value="15">
<C value="5" />
<C value="10" />
<C value="foo"><D name="error" /></C>
</B>
</A>