作者在研究基于opencv的c++读取xml文件中的深度数据过程中,遇到了一个问题。具体如下:
![](https://img-blog.csdnimg.cn/img_convert/1a72b7c4d2cad946cdaa8dcc5085e831.png)
这是作者找的原xml深度数据文件,但是读取不出来,读取程序如下:
![](https://img-blog.csdnimg.cn/img_convert/5d57065b200c6155fa34275d8ac00ca6.png)
经过研究,自己的c++程序没有问题,问题出在xml中的width与height节点,作者通过尝试发现将width改为cols,同时height改为rows就可以读取出来。
于是问题转化为:如何批量将xml文件中的width与height节点替换为cols与rows
代码如下:
#对xml中的节点进行替换,过程是:先删除不要的节点,再添加需要的节点。
import os
import glob
from xml.etree import ElementTree as ET
xml_dir = r'C:\Users\Carry\Downloads\depth\depth\s01_e01'
xml_list = glob.glob(xml_dir + '/*.xml')
for xml in xml_list: #xml_list是一个数组,存储文件夹下所有xml文件
name = os.path.basename(xml)
name = name.split('.')[0] #name表示去掉后缀的文件名
per = ET.parse(xml) #xml表示xml文件路径
root = per.getroot()#获取根节点
src = per.findall(name) #src是个数组
src[0].remove(src[0].find('height'))#删除height节点
src[0].remove(src[0].find('width')) #删除width节点
cols = ET.Element('cols') #创建cols节点
cols.text = '320'
rows = ET.Element('rows') #创建rows节点
rows.text = '240'
src[0].insert(0,cols) #插入cols节点,第一个参数表示插入位置,亦可以用append(),但只能插入到src[0]父节点下的末尾
src[0].insert(1,rows)
per.write(xml,encoding='utf-8',xml_declaration=True)#该处最好加上后面两个参数,这样重新写入的xml文件中才会包含头部说明
print('修改完成!')
如果只修改某个xml文件,去掉for循环即可
以上代码是将height、width替换为rows,cols。使用者要替换节点为其他名字,稍微修改对应位置即可,无伤大雅