ElementTree xmlファイルのインスタンスを解析して変更する


公式のドキュメントを見ることができて、中の内容はとても詳しくて、以下は私が自分でまとめたいくつかのよく使うパッケージ関数です
Element.findall(‘tag’):          ,               。
Element.find('tag'):                
Element.text:        
Element.get():        

             :
      :
for rank in root.iter('rank'):        //                 rank   
...     new_rank = int(rank.text) + 1//  rank   ,   1
...     rank.text = str(new_rank)     //         ,   int,   string
...     rank.set('updated', 'yes')    // rank    :uodated=yes

Element.remove():        
      :
for country in root.findall('country'):      //       country   
...     rank = int(country.find('rank').text)//  country    rank   
...     if rank > 50:                        //    50
...         root.remove(country)             //    rank   country    
...


以下の例は他の人のブログの例から来て、コードはとても詳しくて、xmlファイルを読み込むことからノードまでの添削検査の変更操作がほとんどそろっていることを含んで、1つの欠点があります:ここのxmlファイルを読むのは最も簡単なファイルが小さくて、しかもローカルで直接読むことを考慮します;クライアントとサービス側でxmlファイルを対話する必要がある場合、xmlファイル全体を受信してから操作すると詰まりやすいエンジニアリングがあります.だから公式ドキュメントではtreebuilderと別の方法で解決することに言及しています.
ElementTreeを用いる、まずファイルを読み込み、ツリーに解析した後、経路によってツリーの各ノードに位置決めし、ノードを修正し、最後に直接出力することができる.
#!/usr/bin/python  
# -*- coding=utf-8 -*-  
# author : [email protected]  
# date: 2012-05-25  
# version: 0.1
 
from xml.etree.ElementTree import ElementTree,Element
 
def read_xml(in_path):  
    '''
             xml   
        in_path: xml   
        return: ElementTree
    '''  
    tree = ElementTree()  
    tree.parse(in_path)  
    return tree
 
def write_xml(tree, out_path):  
    '''
         xml     
        tree: xml  
        out_path:     
    '''  
    tree.write(out_path, encoding="utf-8",xml_declaration=True)
 
def if_match(node, kv_map):  
    '''
                           
        node:    
        kv_map:          map
    '''  
    for key in kv_map:  
        if node.get(key) != kv_map.get(key):  
            return False  
    return True
 
#---------------search -----
 
def find_nodes(tree, path):  
    '''
                      
        tree: xml  
        path:     
    '''  
    return tree.findall(path)
 
def get_node_by_keyvalue(nodelist, kv_map):  
    '''
                       ,     
        nodelist:      
        kv_map:         map
    '''  
    result_nodes = []  
    for node in nodelist:  
        if if_match(node, kv_map):  
            result_nodes.append(node)  
    return result_nodes
 
#---------------change -----
 
def change_node_properties(nodelist, kv_map, is_delete=False):  
    '''
          /   /             
        nodelist:      
        kv_map:      map
    '''  
    for node in nodelist:  
        for key in kv_map:  
            if is_delete:   
                if key in node.attrib:  
                    del node.attrib[key]  
            else:  
                node.set(key, kv_map.get(key))
 
def change_node_text(nodelist, text, is_add=False, is_delete=False):  
    '''
          /  /          
        nodelist:     
        text :       
    '''  
    for node in nodelist:  
        if is_add:  
            node.text += text  
        elif is_delete:  
            node.text = ""  
        else:  
            node.text = text
 
def create_node(tag, property_map, content):  
    '''
               
        tag:     
        property_map:      map 
        content:              
        return    
    '''  
    element = Element(tag, property_map)  
    element.text = content  
    return element
 
def add_child_node(nodelist, element):  
    '''
                   
        nodelist:      
        element:    
    '''  
    for node in nodelist:  
        node.append(element)
 
def del_node_by_tagkeyvalue(nodelist, tag, kv_map):  
    '''
                      ,     
        nodelist:       
        tag:      
        kv_map:         
    '''  
    for parent_node in nodelist:  
        children = parent_node.getchildren()  
        for child in children:  
            if child.tag == tag and if_match(child, kv_map):  
                parent_node.remove(child)
 
 
if __name__ == "__main__":
 
    #1.   xml    
    tree = read_xml("./test.xml")
 
    #2.       
    #A.        
    nodes = find_nodes(tree, "processers/processer")
 
    #B.              
    result_nodes = get_node_by_keyvalue(nodes, {"name":"BProcesser"})
 
    #C.         
    change_node_properties(result_nodes, {"age": "1"})
 
    #D.         
    change_node_properties(result_nodes, {"value":""}, True)
 
    #3.       
    #A.      
    a = create_node("person", {"age":"15","money":"200000"}, "this is the firest content")
 
    #B.          
    add_child_node(result_nodes, a)
 
    #4.       
    #       
    del_parent_nodes = find_nodes(tree, "processers/services/service")
 
    #             
    target_del_node = del_node_by_tagkeyvalue(del_parent_nodes, "chain", {"sequency" : "chain1"})
 
    #5.         
    #      
    text_nodes = get_node_by_keyvalue(find_nodes(tree, "processers/services/service/chain"), {"sequency":"chain3"})  
    change_node_text(text_nodes, "new text")
 
    #6.          
    write_xml(tree, "./out.xml")

操作オブジェクト(元のxmlファイル):
  
  
      
          
          
          
          
        
 
          
            
 
                  
                  
              
              
                  
              
          
      

プログラムを実行した結果ファイル:
  
  
      
          
          
          
            this is the firest content  
          
          
            this is the firest content  
        
 
          
            
 
                  
              
              
                new text