目的:在已有的xml文件下将子节点polygon删除,并基于其中数据生成新的节点bndbox。
import xml.dom.minidom
#####使用的是这个库,不同库之间混用会报错
def str_int(a):########将str变成int,只取“.”前面位数的
b=0
for i in range(a.index(".")):
b=int(a[(a.index(".")-i-1)])*(10**i)+b
return(b)
##############这里将str变成int,因为我从xml中读到的nodeVelue是str。
#打开xml文档
dom = xml.dom.minidom.parse('C:/Users/lh/Desktop/000018.xml')
#得到文档元素对象
root = dom.documentElement
movies = root.getElementsByTagName("object")
for movie in movies:
print ("*****Movie*****")
##################返回ployog下的piont点的值,以str形式
xmin=100000
xmax=0
ymin=100000
ymax=0
#########这就很容易取点取到空集,研究了一整天,发现可以通过childNodes解决这件事情,但是有个弊端,或者说我现在懒的去做,就是这个只能根据位置取,没办法根据名字取
z=movie.getElementsByTagName('polygon')[0].childNodes
for pp in range(len(z)):
if (z[pp].nodeName=="point"):
a=z[pp].childNodes[1].childNodes[0].data
xmin=min(xmin,str_int(a))
xmax=max(xmax,str_int(a))
b=z[pp].childNodes[3].childNodes[0].data
ymin=min(ymin,str_int(b))
ymax=max(ymax,str_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)
#zd.appendChild(bbox)
#######新生成的节点输出不好看连一片,不分层,都没事儿,等会儿输出xml时调一下就ok了
网友评论