插入一个元素的节点在XML与Python/ElementTree的
问题描述:
我需要遍历XML树添加子元件当该值小于5。 例如,该XML可以被修改成插入一个元素的节点在XML与Python/ElementTree的
<?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做到这一点?
答
你可能做了一个错字,因为在本例中,错误元素添加为元素,其值是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>
+0
我关心的是,全深度for循环会在这里迭代新添加的子元素吗?例如。如果for是通过`in list(tree.getroot())`完成的,并且在迭代过程中某个节点被添加到某处。 – n611x007 2013-10-25 15:15:33
答
ElementTree的iter(或getiterator的Python < 2.7)预订购递归返回的所有节点在树上,然后只是测试你的病情,并创建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'))
相关:http://stackoverflow.com/questions/4788958/set-the-value-of-xml-file-recursively -with-python-elementtree – jfs 2011-01-25 03:12:42
可以有多个``孩子吗?你是否考虑过向有问题的元素添加“error”属性的选项? –
2011-01-25 04:06:02