乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Python xml屬性/節(jié)點(diǎn)/文本的增刪改[xml.etree.ElementTree]

       imelee 2016-12-10

      博客已遷移, 新地址


      ========================

      需求:

      在實(shí)際應(yīng)用中,需要對xml配置文件進(jìn)行實(shí)時(shí)修改, 

       1.增加、刪除 某些節(jié)點(diǎn)

       2.增加,刪除,修改某個(gè)節(jié)點(diǎn)下的某些屬性

       3.增加,刪除,修改某些節(jié)點(diǎn)的文本


      xml源文件格式[例]

      1. <?xml version="1.0" encoding="UTF-8"?>  
      2. <framework>  
      3.     <processers>  
      4.         <processer name="AProcesser" file="lib64/A.so"  
      5.             path="/tmp">  
      6.         </processer>  
      7.         <processer name="BProcesser" file="lib64/B.so" value="fordelete">  
      8.         </processer>  
      9.         <processer name="BProcesser" file="lib64/B.so2222222"/>  
      10.           
      11.         <services>  
      12.             <service name="search" prefix="/bin/search?"  
      13.                 output_formatter="OutPutFormatter:service_inc">  
      14.                   
      15.                 <chain sequency="chain1"/>  
      16.                 <chain sequency="chain2"></chain>  
      17.             </service>  
      18.             <service name="update" prefix="/bin/update?">  
      19.                 <chain sequency="chain3" value="fordelete"/>  
      20.             </service>  
      21.         </services>  
      22.     </processers>  
      23. </framework>  

      使用庫:

      xml.etree.ElementTree 

      官方文檔地址:http://docs./library/xml.etree.elementtree.html


      實(shí)現(xiàn)思想:

      使用ElementTree,先將文件讀入,解析成樹,之后,根據(jù)路徑,可以定位到樹的每個(gè)節(jié)點(diǎn),再對節(jié)點(diǎn)進(jìn)行修改,最后直接將其輸出


      代碼附文檔:

      1. #!/usr/bin/python  
      2. # -*- coding=utf-8 -*-  
      3. # author : wklken@yeah.net  
      4. # date: 2012-05-25  
      5. # version: 0.1  
      6.   
      7. from xml.etree.ElementTree import ElementTree,Element  
      8.   
      9. def read_xml(in_path):  
      10.     '''''讀取并解析xml文件 
      11.        in_path: xml路徑 
      12.        return: ElementTree'''  
      13.     tree = ElementTree()  
      14.     tree.parse(in_path)  
      15.     return tree  
      16.   
      17. def write_xml(tree, out_path):  
      18.     '''''將xml文件寫出 
      19.        tree: xml樹 
      20.        out_path: 寫出路徑'''  
      21.     tree.write(out_path, encoding="utf-8",xml_declaration=True)  
      22.   
      23. def if_match(node, kv_map):  
      24.     '''''判斷某個(gè)節(jié)點(diǎn)是否包含所有傳入?yún)?shù)屬性 
      25.        node: 節(jié)點(diǎn) 
      26.        kv_map: 屬性及屬性值組成的map'''  
      27.     for key in kv_map:  
      28.         if node.get(key) != kv_map.get(key):  
      29.             return False  
      30.     return True  
      31.   
      32. #---------------search -----  
      33.   
      34. def find_nodes(tree, path):  
      35.     '''''查找某個(gè)路徑匹配的所有節(jié)點(diǎn) 
      36.        tree: xml樹 
      37.        path: 節(jié)點(diǎn)路徑'''  
      38.     return tree.findall(path)  
      39.   
      40.   
      41. def get_node_by_keyvalue(nodelist, kv_map):  
      42.     '''''根據(jù)屬性及屬性值定位符合的節(jié)點(diǎn),返回節(jié)點(diǎn) 
      43.        nodelist: 節(jié)點(diǎn)列表 
      44.        kv_map: 匹配屬性及屬性值map'''  
      45.     result_nodes = []  
      46.     for node in nodelist:  
      47.         if if_match(node, kv_map):  
      48.             result_nodes.append(node)  
      49.     return result_nodes  
      50.   
      51. #---------------change -----  
      52.   
      53. def change_node_properties(nodelist, kv_map, is_delete=False):  
      54.     '''''修改/增加 /刪除 節(jié)點(diǎn)的屬性及屬性值 
      55.        nodelist: 節(jié)點(diǎn)列表 
      56.        kv_map:屬性及屬性值map'''  
      57.     for node in nodelist:  
      58.         for key in kv_map:  
      59.             if is_delete:   
      60.                 if key in node.attrib:  
      61.                     del node.attrib[key]  
      62.             else:  
      63.                 node.set(key, kv_map.get(key))  
      64.               
      65. def change_node_text(nodelist, text, is_add=False, is_delete=False):  
      66.     '''''改變/增加/刪除一個(gè)節(jié)點(diǎn)的文本 
      67.        nodelist:節(jié)點(diǎn)列表 
      68.        text : 更新后的文本'''  
      69.     for node in nodelist:  
      70.         if is_add:  
      71.             node.text += text  
      72.         elif is_delete:  
      73.             node.text = ""  
      74.         else:  
      75.             node.text = text  
      76.               
      77. def create_node(tag, property_map, content):  
      78.     '''''新造一個(gè)節(jié)點(diǎn) 
      79.        tag:節(jié)點(diǎn)標(biāo)簽 
      80.        property_map:屬性及屬性值map 
      81.        content: 節(jié)點(diǎn)閉合標(biāo)簽里的文本內(nèi)容 
      82.        return 新節(jié)點(diǎn)'''  
      83.     element = Element(tag, property_map)  
      84.     element.text = content  
      85.     return element  
      86.           
      87. def add_child_node(nodelist, element):  
      88.     '''''給一個(gè)節(jié)點(diǎn)添加子節(jié)點(diǎn) 
      89.        nodelist: 節(jié)點(diǎn)列表 
      90.        element: 子節(jié)點(diǎn)'''  
      91.     for node in nodelist:  
      92.         node.append(element)  
      93.           
      94. def del_node_by_tagkeyvalue(nodelist, tag, kv_map):  
      95.     '''''同過屬性及屬性值定位一個(gè)節(jié)點(diǎn),并刪除之 
      96.        nodelist: 父節(jié)點(diǎn)列表 
      97.        tag:子節(jié)點(diǎn)標(biāo)簽 
      98.        kv_map: 屬性及屬性值列表'''  
      99.     for parent_node in nodelist:  
      100.         children = parent_node.getchildren()  
      101.         for child in children:  
      102.             if child.tag == tag and if_match(child, kv_map):  
      103.                 parent_node.remove(child)  
      104.                           
      105.   
      106.   
      107. if __name__ == "__main__":  
      108.       
      109.     #1. 讀取xml文件  
      110.     tree = read_xml("./test.xml")  
      111.       
      112.     #2. 屬性修改  
      113.       #A. 找到父節(jié)點(diǎn)  
      114.     nodes = find_nodes(tree, "processers/processer")  
      115.       #B. 通過屬性準(zhǔn)確定位子節(jié)點(diǎn)  
      116.     result_nodes = get_node_by_keyvalue(nodes, {"name":"BProcesser"})  
      117.       #C. 修改節(jié)點(diǎn)屬性  
      118.     change_node_properties(result_nodes, {"age": "1"})  
      119.       #D. 刪除節(jié)點(diǎn)屬性  
      120.     change_node_properties(result_nodes, {"value":""}, True)  
      121.       
      122.     #3. 節(jié)點(diǎn)修改  
      123.       #A.新建節(jié)點(diǎn)  
      124.     a = create_node("person", {"age":"15","money":"200000"}, "this is the firest content")  
      125.       #B.插入到父節(jié)點(diǎn)之下  
      126.     add_child_node(result_nodes, a)  
      127.       
      128.     #4. 刪除節(jié)點(diǎn)  
      129.        #定位父節(jié)點(diǎn)  
      130.     del_parent_nodes = find_nodes(tree, "processers/services/service")  
      131.        #準(zhǔn)確定位子節(jié)點(diǎn)并刪除之  
      132.     target_del_node = del_node_by_tagkeyvalue(del_parent_nodes, "chain", {"sequency" : "chain1"})  
      133.       
      134.     #5. 修改節(jié)點(diǎn)文本  
      135.        #定位節(jié)點(diǎn)  
      136.     text_nodes = get_node_by_keyvalue(find_nodes(tree, "processers/services/service/chain"), {"sequency":"chain3"})  
      137.     change_node_text(text_nodes, "new text")  
      138.       
      139.     #6. 輸出到結(jié)果文件  
      140.     write_xml(tree, "./out.xml")  
      141.       
      142.    


      通過main處理后的結(jié)果文件:

      1. <?xml version='1.0' encoding='utf-8'?>  
      2. <framework>  
      3.     <processers>  
      4.         <processer file="lib64/A.so" name="AProcesser" path="/tmp">  
      5.         </processer>  
      6.         <processer age="1" file="lib64/B.so" name="BProcesser">  
      7.             <person age="15" money="200000">this is the firest content</person>  
      8.         </processer>  
      9.         <processer age="1" file="lib64/B.so2222222" name="BProcesser">  
      10.             <person age="15" money="200000">this is the firest content</person>  
      11.         </processer>  
      12.   
      13.         <services>  
      14.             <service name="search" output_formatter="OutPutFormatter:service_inc"  
      15.                 prefix="/bin/search?">  
      16.   
      17.                 <chain sequency="chain2" />  
      18.             </service>  
      19.             <service name="update" prefix="/bin/update?">  
      20.                 <chain sequency="chain3" value="fordelete">new text</chain>  
      21.             </service>  
      22.         </services>  
      23.     </processers>  
      24. </framework>  



      The end!

      wklken

      2012-05-25



        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請遵守用戶 評(píng)論公約

        類似文章 更多