ElementTree xmlファイルのインスタンスを解析して変更する
7461 ワード
公式のドキュメントを見ることができて、中の内容はとても詳しくて、以下は私が自分でまとめたいくつかのよく使うパッケージ関数です
以下の例は他の人のブログの例から来て、コードはとても詳しくて、xmlファイルを読み込むことからノードまでの添削検査の変更操作がほとんどそろっていることを含んで、1つの欠点があります:ここのxmlファイルを読むのは最も簡単なファイルが小さくて、しかもローカルで直接読むことを考慮します;クライアントとサービス側でxmlファイルを対話する必要がある場合、xmlファイル全体を受信してから操作すると詰まりやすいエンジニアリングがあります.だから公式ドキュメントではtreebuilderと別の方法で解決することに言及しています.
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