操作xml

2020-09-08  本文已影响0人  修炼的狐狸

目的:在已有的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了

上一篇下一篇

猜你喜欢

热点阅读