2011-01-25 74 views
9

我需要遍歷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://stackoverflow.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

回答

13

你可能做了一個錯字,因爲在本例中,錯誤元素添加爲元素,其值是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

2

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'))