python读取XML中bndbox和object name的方法

直接贴代码了,封装为了函数,直接调用即可。其中有几个点需要注意。
1、bndbox下面有4个子对象,因此不能直接使用firstChild来找到内容,需要从该对象里面继续寻找标签为xmin等这样的对象,注意要加[0]才正确,有问题的可以直接调试,然后看变量的结构,根据变量的结构来调用某一对象。
2、将空格' '替换为'_',方便命名。但是使用str.replace(' ', '_')不会直接改变str的内容,返回的字符串是改变后的,因此需要变量保存。
import xml.dom.minidom as xmldom
def get_bndboxfromxml(imageNum, xmlfilebasepath):
    # 读取xml文件
    bndbox = [0, 0, 0, 0]
    xmlfilepath = xmlfilebasepath + "\%06d" % imageNum+'.xml'
    # print(xmlfilepath)
    domobj = xmldom.parse(xmlfilepath)
    elementobj = domobj.documentElement
    sub_element_obj = elementobj.getElementsByTagName('bndbox')
    if sub_element_obj is not None:
        bndbox[0] = int(sub_element_obj[0].getElementsByTagName('xmin')[0].firstChild.data)
        bndbox[1] = int(sub_element_obj[0].getElementsByTagName('ymin')[0].firstChild.data)
        bndbox[2] = int(sub_element_obj[0].getElementsByTagName('xmax')[0].firstChild.data)
        bndbox[3] = int(sub_element_obj[0].getElementsByTagName('ymax')[0].firstChild.data)
    return bndbox


def get_bndboxnamefromxml(imageNum, xmlfilebasepath):
    bndbox = [0, 0, 0, 0]
    xmlfilepath = xmlfilebasepath + "\%06d" % imageNum + '.xml'
    domobj = xmldom.parse(xmlfilepath)
    elementobj = domobj.documentElement
    sub_element_obj = elementobj.getElementsByTagName('name')
    name = sub_element_obj[0].firstChild.data.replace(' ', '_')

    return name
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你用 Python 在已经标注的 XML 文件添加一个新的 object 元素,并为其添加 bndbox 元素。同样需要使用 ElementTree 库并读取 XML 文件,并将其解析为 ElementTree 对象。然后,我们可以使用 ElementTree 对象方法来找到需要添加 object 元素的节点,并在该节点下添加新的 object 元素。接着,我们可以使用 `ET.SubElement()` 方法创建新的 bndbox 元素,并使用 `set()` 方法添加 xmin、ymin、xmax 和 ymax 属性。以下是一个示例代码: ```python import xml.etree.ElementTree as ET # 读取 XML 文件 tree = ET.parse('annotated.xml') root = tree.getroot() # 查找需要添加 object 元素的节点 node = root.find('object') # 创建新的 object 元素 new_object = ET.Element('object') name = ET.Element('name') name.text = 'new_object' new_object.append(name) type = ET.Element('type') type.text = 'typeA' new_object.append(type) # 创建新的 bndbox 元素 bndbox = ET.SubElement(new_object, 'bndbox') bndbox.set('xmin', '100') bndbox.set('ymin', '200') bndbox.set('xmax', '300') bndbox.set('ymax', '400') # 添加新的 object 元素到节点 node.addnext(new_object) # 保存修改后的 XML 文件 tree.write('annotated.xml') ``` 在上面的代码,我们首先使用 `ET.parse()` 方法读取 XML 文件,然后使用 `root.find()` 方法找到需要添加 object 元素的节点。接着,我们使用 `ET.Element()` 方法创建新的 object 元素,并使用 `ET.Element()` 方法创建 name 和 type 元素,并使用 `element.text` 属性将文本添加到元素。然后,我们使用 `ET.SubElement()` 方法创建新的 bndbox 元素,并使用 `set()` 方法添加 xmin、ymin、xmax 和 ymax 属性。最后,我们使用 `element.append()` 方法bndbox 元素添加到 object 元素。最终,我们使用 `node.addnext()` 方法将新的 object 元素添加到节点的下一个位置。最终,我们使用 `tree.write()` 方法保存修改后的 XML 文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值