您的位置:首页 > 其它

修改xml文件中节点的值

2017-01-18 21:37 337 查看

修改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节点信息,需要

from xml.etree.ElementTree import ElementTree,Element


然后解析xml

tree = ElementTree().parse(xml_path)#解析xml文件路径,注意 ElementTree后面一定要加(),不然会报错


node1=tree.find('./size/width')#在解析完成的tree中查找width子节点
node1.text = str(pic_width)#将图片中的宽度信息更新在xml中,注意这里要转换成str类型


node2 = tree.find('./size/height')#在解析完成的tree中查找height子节点
node2.text = str(pic_height)#注意这里要转换成str类型


注意

到这里之后还没完,这样修改之后并不是直接将原xml文件修改了。一定要执行保存操作生成新xml文件

tree.write(out_path, encoding="utf-8", xml_declaration=True)#如果要直接再原xml上进行修改,直接将                                                            #out_path改成原来的路径即可。


后来在网上看到一个博主总结的特别好,所以搬过来了

http://blog.csdn.net/wklken/article/details/7603071

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐