操作xml

作者: 修炼的狐狸 | 来源:发表于2020-09-08 16:55 被阅读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了

    相关文章

      网友评论

          本文标题:操作xml

          本文链接:https://www.haomeiwen.com/subject/gsodektx.html