修改xml文件中节点的值

修改xml文件中节点的值

在深度学习中的样本,xml文件中记录着图片的各种信息。现在图片更改了,所以需要对应地修改xml中的数据。

①读取图片的尺寸信息

②修改对应的xml,将真实尺寸修改

要修改的xml


<annotation>
    <folder>doublefolder>
    <filename>0001filename>
    <path>C:\Users\Think\Desktop\asd\double\0001.jpgpath>
    <source>
        <database>Unknowndatabase>
    source>
    <size>
        <width>474width>
        <height>790height>
        <depth>3depth>
    size>
    <segmented>0segmented>
    <object>
        <name>1name>
        <pose>Unspecifiedpose>
        <truncated>0truncated>
        <difficult>0difficult>
        <bndbox>
            <xmin>272xmin>
            <ymin>229ymin>
            <xmax>424xmax>
            <ymax>486ymax>
        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)


你可能感兴趣的:(深度学习)