插入一个元素的节点在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做到这一点?

+0

相关:http://*.com/questions/4788958/set-the-value-of-xml-file-recursively -with-python-elementtree – jfs 2011-01-25 03:12:42

+0

可以有多个``孩子吗?你是否考虑过向有问题的元素添加“error”属性的选项? – 2011-01-25 04:06:02

你可能做了一个错字,因为在本例中,错误元素添加为元素,其值是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

ElementTreeiter(或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'))