修改xml⽂件中节点的值
修改xml⽂件中节点的值
在深度学习中的样本,xml⽂件中记录着图⽚的各种信息。现在图⽚更改了,所以需要对应地修改xml中的数据。
①读取图⽚的尺⼨信息
②修改对应的xml,将真实尺⼨修改
要修改的xml
<?xml version='1.0' encoding='utf-8'?>
<annotation>
<folder>double</folder>
<filename>0001</filename>
<path>C:\Users\Think\Desktop\asd\double\0001.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
<width>474</width>
<height>790</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>1</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>272</xmin>
<ymin>229</ymin>
<xmax>424</xmax>
<ymax>486</ymax>
</bndbox>
</object>
开始
from PIL import Image
导⼊Image模块,获取图⽚信息
img = Image.open(pic_path)
imgSize = img.size
pic_height = max(imgSize)
pic_width = min(imgSize)
修改xml节点信息,需要
ElementTree import ElementTree,Element
然后解析xml
tree = ElementTree().parse(xml_path)#解析xml⽂件路径,注意 ElementTree后⾯⼀定要加(),不然会报错
node1=tree.find('./size/width')#在解析完成的tree中查width⼦节点
< = str(pic_width)#将图⽚中的宽度信息更新在xml中,注意这⾥要转换成str类型
node2 = tree.find('./size/height')#在解析完成的tree中查height⼦节点
< = str(pic_height)#注意这⾥要转换成str类型
注意:
到这⾥之后还没完,这样修改之后并不是直接将原xml⽂件修改了。⼀定要执⾏保存操作⽣成新xml⽂件
tree.write(out_path, encoding="utf-8", xml_declaration=True)#如果要直接再原xml上进⾏修改,直接将 #out_path改成原后来在⽹上看到⼀个博主总结的特别好,所以搬过来了
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:
(key) != (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 node in nodelist:
python处理xml文件for key in kv_map:
if is_delete:
if key in node.attrib:
del node.attrib[key]
else:
node.set(key, (key))
def change_node_text(nodelist, text, is_add=False, is_delete=False): '''改变/增加/删除⼀个节点的⽂本
nodelist:节点列表
text : 更新后的⽂本'''
for node in nodelist:
if is_add:
< += text
elif is_delete:
< = ""
else:
< = text
def create_node(tag, property_map, content):
'''新造⼀个节点
tag:节点标签
property_map:属性及属性值map
content: 节点闭合标签⾥的⽂本内容
return 新节点'''
element = Element(tag, property_map)
< = 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 = hildren()
for child in children:
if child.tag == tag and if_match(child, kv_map):
ve(child)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论