亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

詳解在Python程序中解析并修改XML內容的方法

2020-01-04 17:57:30
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了在Python程序中解析并修改XML內容的方法,依賴于解析成樹狀結構后的節點進行修改,需要的朋友可以參考下

需求

在實際應用中,需要對xml配置文件進行實時修改,

1.增加、刪除 某些節點

2.增加,刪除,修改某個節點下的某些屬性

3.增加,刪除,修改某些節點的文本

使用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> 

實現思想

使用ElementTree,先將文件讀入,解析成樹,之后,根據路徑,可以定位到樹的每個節點,再對節點進行修改,最后直接將其輸出

實現代碼

 

 
  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. '''判斷某個節點是否包含所有傳入參數屬性 
  25. node: 節點 
  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. def find_nodes(tree, path): 
  34. '''查找某個路徑匹配的所有節點 
  35. tree: xml樹 
  36. path: 節點路徑''
  37. return tree.findall(path) 
  38.  
  39. def get_node_by_keyvalue(nodelist, kv_map): 
  40. '''根據屬性及屬性值定位符合的節點,返回節點 
  41. nodelist: 節點列表 
  42. kv_map: 匹配屬性及屬性值map''
  43. result_nodes = [] 
  44. for node in nodelist: 
  45. if if_match(node, kv_map): 
  46. result_nodes.append(node) 
  47. return result_nodes 
  48.  
  49. #---------------change ----- 
  50. def change_node_properties(nodelist, kv_map, is_delete=False): 
  51. '''修改/增加 /刪除 節點的屬性及屬性值 
  52. nodelist: 節點列表 
  53. kv_map:屬性及屬性值map''
  54. for node in nodelist: 
  55. for key in kv_map: 
  56. if is_delete: 
  57. if key in node.attrib: 
  58. del node.attrib[key] 
  59. else
  60. node.set(key, kv_map.get(key)) 
  61.  
  62. def change_node_text(nodelist, text, is_add=False, is_delete=False): 
  63. '''改變/增加/刪除一個節點的文本 
  64. nodelist:節點列表 
  65. text : 更新后的文本''
  66. for node in nodelist: 
  67. if is_add: 
  68. node.text += text 
  69. elif is_delete: 
  70. node.text = "" 
  71. else
  72. node.text = text 
  73.  
  74. def create_node(tag, property_map, content): 
  75. '''新造一個節點 
  76. tag:節點標簽 
  77. property_map:屬性及屬性值map 
  78. content: 節點閉合標簽里的文本內容 
  79. return 新節點''
  80. element = Element(tag, property_map) 
  81. element.text = content 
  82. return element 
  83.  
  84. def add_child_node(nodelist, element): 
  85. '''給一個節點添加子節點 
  86. nodelist: 節點列表 
  87. element: 子節點''
  88. for node in nodelist: 
  89. node.append(element) 
  90.  
  91. def del_node_by_tagkeyvalue(nodelist, tag, kv_map): 
  92. '''同過屬性及屬性值定位一個節點,并刪除之 
  93. nodelist: 父節點列表 
  94. tag:子節點標簽 
  95. kv_map: 屬性及屬性值列表''
  96. for parent_node in nodelist: 
  97. children = parent_node.getchildren() 
  98. for child in children: 
  99. if child.tag == tag and if_match(child, kv_map): 
  100. parent_node.remove(child) 
  101.  
  102. if __name__ == "__main__"
  103. #1. 讀取xml文件 
  104. tree = read_xml("./test.xml"
  105.  
  106. #2. 屬性修改 
  107. #A. 找到父節點 
  108. nodes = find_nodes(tree, "processers/processer"
  109. #B. 通過屬性準確定位子節點 
  110. result_nodes = get_node_by_keyvalue(nodes, {"name":"BProcesser"}) 
  111. #C. 修改節點屬性 
  112. change_node_properties(result_nodes, {"age""1"}) 
  113. #D. 刪除節點屬性 
  114. change_node_properties(result_nodes, {"value":""}, True) 
  115.  
  116. #3. 節點修改 
  117. #A.新建節點 
  118. a = create_node("person", {"age":"15","money":"200000"}, "this is the firest content"
  119. #B.插入到父節點之下 
  120. add_child_node(result_nodes, a) 
  121.  
  122. #4. 刪除節點 
  123. #定位父節點 
  124. del_parent_nodes = find_nodes(tree, "processers/services/service"
  125. #準確定位子節點并刪除之 
  126. target_del_node = del_node_by_tagkeyvalue(del_parent_nodes, "chain", {"sequency" : "chain1"}) 
  127.  
  128. #5. 修改節點文本 
  129. #定位節點 
  130. text_nodes = get_node_by_keyvalue(find_nodes(tree, "processers/services/service/chain"), {"sequency":"chain3"}) 
  131. change_node_text(text_nodes, "new text"
  132.  
  133. #6. 輸出到結果文件 
  134. write_xml(tree, "./out.xml"

修改后的結果

 

 
  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> 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美极品少妇与黑人| 国产在线久久久| 2019日本中文字幕| 久久99久久99精品中文字幕| 狠狠久久五月精品中文字幕| 色av吧综合网| 亚洲a成v人在线观看| 亚洲欧美国产精品va在线观看| 精品爽片免费看久久| 性欧美视频videos6一9| 日韩国产激情在线| 欧美第一淫aaasss性| 亚洲国产精品免费| 日韩va亚洲va欧洲va国产| 国外成人在线直播| 少妇精69xxtheporn| 性色av一区二区三区| 欧美日韩不卡合集视频| 欧美电影在线观看完整版| 亚洲香蕉av在线一区二区三区| 亚洲第一男人天堂| 国产精品白嫩初高中害羞小美女| 亚洲欧洲国产伦综合| 色香阁99久久精品久久久| 国产精品久久久久久久久粉嫩av| 欧美高清不卡在线| 九九精品在线观看| 久久五月天色综合| 国产91久久婷婷一区二区| 日韩av日韩在线观看| 色老头一区二区三区在线观看| 欧美日韩在线视频首页| 在线观看日韩www视频免费| 亚洲福利视频免费观看| 中文字幕综合在线| 欧美精品在线极品| www国产亚洲精品久久网站| 精品国产成人在线| 日韩av中文字幕在线免费观看| 国产精品免费一区| 国产亚洲视频中文字幕视频| 国产视频综合在线| 欧美一乱一性一交一视频| 国产99久久精品一区二区| 亚洲乱码av中文一区二区| 久久精品国产96久久久香蕉| 欧美激情xxxxx| 国内精品国产三级国产在线专| 国产亚洲人成a一在线v站| 精品国产一区二区三区久久狼5月| 欧美日韩国产中字| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲国产天堂网精品网站| 中文字幕在线看视频国产欧美在线看完整| 国产成人一区二| 懂色aⅴ精品一区二区三区蜜月| 日本a级片电影一区二区| 亚洲欧美制服综合另类| 欧美成人免费视频| 精品久久久999| 国产日韩欧美日韩| 538国产精品一区二区在线| 538国产精品一区二区免费视频| 在线日韩日本国产亚洲| 精品国内亚洲在观看18黄| 久久国产精彩视频| 精品久久久久久久久久久久久| 亚洲白虎美女被爆操| 亚洲第一男人av| 4438全国成人免费| 日本国产精品视频| 色综合久久88| 美日韩丰满少妇在线观看| 欧美黄色性视频| 日韩在线欧美在线| 久久精品国产视频| 亚洲精品天天看| 亚洲天堂久久av| 成人黄色激情网| 亚洲精品视频中文字幕| 中文字幕久久亚洲| 亚洲va久久久噜噜噜久久天堂| 国产91ⅴ在线精品免费观看| 久久久久久亚洲| 国产激情视频一区| 国语自产偷拍精品视频偷| 精品丝袜一区二区三区| 久久精品视频在线| 欧美专区福利在线| 国产亚洲精品激情久久| 亚洲电影免费观看高清完整版在线| 亚洲精品一二区| 久久视频在线免费观看| 日韩av免费在线观看| 国产激情久久久| 久久亚洲私人国产精品va| 国产成人精彩在线视频九色| 亚洲福利视频专区| 欧美日韩精品中文字幕| 欧美性猛交xxxx富婆弯腰| 亚洲第一网站免费视频| 这里只有视频精品| 95av在线视频| 成人乱人伦精品视频在线观看| 亚洲精品美女久久久| 国色天香2019中文字幕在线观看| 日韩中文字幕在线视频| 国产偷国产偷亚洲清高网站| 97精品视频在线播放| 日韩精品免费在线视频| 久久亚洲综合国产精品99麻豆精品福利| 色www亚洲国产张柏芝| 国产精品成人观看视频国产奇米| 高清一区二区三区日本久| 亚洲精品久久在线| 久久免费视频观看| 亚洲男人天堂手机在线| 亚洲自拍偷拍在线| 国产欧美日韩中文| 国产精品久久久久7777婷婷| 91在线观看免费高清完整版在线观看| 久久久女女女女999久久| 一本色道久久88综合日韩精品| 中文字幕欧美精品在线| 国外色69视频在线观看| 久久精品国产2020观看福利| 精品久久久免费| 国产91成人video| 精品一区电影国产| 国内精品国产三级国产在线专| 久久久久久久激情视频| 欧美午夜激情小视频| 国产精品99蜜臀久久不卡二区| 91综合免费在线| 亚洲人成毛片在线播放| 久久久久久国产精品美女| 69国产精品成人在线播放| 亚洲精品久久久久久久久| 91在线免费看网站| 欧美日韩国产丝袜另类| 日韩大胆人体377p| 日韩精品一区二区三区第95| 欧美成人四级hd版| 亚洲欧美在线第一页| 亚洲三级黄色在线观看| 国产日产久久高清欧美一区| 欧洲s码亚洲m码精品一区| 最近2019年好看中文字幕视频| 日韩av免费在线观看| 亚洲一区二区黄| 亚洲人成绝费网站色www| 国产精品永久免费| 中文字幕无线精品亚洲乱码一区| 亚洲第一色在线| 精品亚洲男同gayvideo网站| 久久影视免费观看| 97精品国产97久久久久久| 国产成人免费av| 亚洲精品网址在线观看| 日韩在线观看视频免费| 国产精品旅馆在线| 亚洲aⅴ日韩av电影在线观看| 在线观看国产精品日韩av| 亚洲福利在线视频|