import xml.dom.minidom
import os.path
path = "D:/pythonProject/polygonToBndboxS/Anno/winecellar"#路径
files = os.listdir(path) # 返回文件夹中的文件名列表
print(files)
for xmlFile in files:
if not os.path.isdir(xmlFile):#os.path.isdir()用于判断对象是否为一个目录
#如果不是目录,则直接打开
name1 = xmlFile.split('.')[0]
print(name1)
dom = xml.dom.minidom.parse(path+'\\'+xmlFile)# 打开xml文档
print(dom)
# 得到文档元素对象
root = dom.documentElement
movies = root.getElementsByTagName("object")
for movie in movies:
print("*****Movie*****")
##################返回ployog下的piont点的值,以str形式
xmin = 10000000
xmax = 0
ymin = 10000000
ymax = 0
#########这就很容易取点取到空集,研究了一整天,发现可以通过childNodes解决这件事情,但是有个弊端,就是这个只能根据位置取,没办法根据名字取
z = movie.getElementsByTagName('polygon')[0].childNodes
# print('__________________')
for pp in range(len(z)):
if z[pp].nodeName == "pt":#注意这里的名字,也可能是point
a = z[pp].getElementsByTagName('x')[0].childNodes[0].data
xmin = min(xmin, int(a))
xmax = max(xmax, int(a))
b = z[pp].getElementsByTagName('y')[0].childNodes[0].data
ymin = min(ymin, int(b))
ymax = max(ymax, int(b))
# print(a, b)
print(xmin, xmax)
print(ymin, ymax)
movie.removeChild(movie.getElementsByTagName('polygon')[0])
###########这儿是生成新的节点,试过其他方式,都不行,通过dir()找到一个ownerDocument属性,完美解决,dir()是神器啊
zd = movie.ownerDocument
bbox = zd.createElement('bbox')
movie.appendChild(bbox)
xx = zd.createElement('xmax')
xn = zd.createElement('xmin')
yx = zd.createElement('ymax')
yn = zd.createElement('ymin')
xx_text = zd.createTextNode(str(xmax))
xx.appendChild(xx_text)
# xx.nodeValue=xmax
##############尝试通过xn.nodeVelue对xn赋值,但是输出xml时赋予的值消失了,并不显示。换成下面的方式,要将数值变成str
xn_text = zd.createTextNode(str(xmin))
yx_text = zd.createTextNode(str(ymax))
yn_text = zd.createTextNode(str(ymin))
xn.appendChild(xn_text)
yx.appendChild(yx_text)
yn.appendChild(yn_text)
bbox.appendChild(xx)
bbox.appendChild(xn)
bbox.appendChild(yx)
bbox.appendChild(yn)
try:
with open(path+'\\'+xmlFile, 'w', encoding='UTF-8') as fh:
# 4.writexml()第一个参数是目标文件对象,第二个参数是根节点的缩进格式,第三个参数是其他子节点的缩进格式,
# 第四个参数制定了换行格式,第五个参数制定了xml内容的编码。
dom.writexml(fh, indent='', addindent='\t', newl='\n', encoding='UTF-8')
print('OK')
except Exception as err:
print('错误:{err}'.format(err=err))
# zd.appendChild(bbox)
参考:
https://www.jianshu.com/p/0b331e761aa5
https://www.cnblogs.com/wcwnina/p/7222180.html
https://zhuanlan.zhihu.com/p/102760157