XML 文件的生成与解析

利用 Python 实现 XML 文件的读写,完成两个内容:
(1)创建 XML 文件,可使用 xml.dom.minidom,以生成 XML 文件。
函数原型: def create_xml(path)
参数 path: xml 文件的保存路径(包含文件名),要求支持相对路径。
返回值:无。
要求生成的 XML 文件结构与参考内容如下表所示。
<?xml version="1.0" ?>
<tilemap tilemapservice="http://tms.osgeo.org/1.0.0" version="1.0.0">
<title>default</title>
<abstract/>
<srs>EPSG:4326</srs>
<vsrs/>
<boundingbox maxx="180.0" maxy="90.0" minx="-180.0" miny="-90.0" />
<origin x="-180.0" y="-90.0" />
<tileformat extension="tif" height="17" mime-type="image/tiff" width="17" />
<tilesets profile="global-geodetic">
<tileset href="" order="0" units-per-pixel="10.588" />
<tileset href="" order="1" units-per-pixel="5.294" />
<tileset href="" order="2" units-per-pixel="2.647" />
<tileset href="" order="3" units-per-pixel="1.323" />
<tileset href="" order="4" units-per-pixel="0.661" />
<tileset href="" order="5" units-per-pixel="0.331" />
</tilesets>
</tilemap>
(2)对指定的 XML 文件进行读取,可使用 xml.etree.ElementTree 解析 XML 文件。
函数原型: def parse_xml(path)
参数 path:要解析的 xml 文件路径,要求支持相对路径。
返回值:返回值类型为字典,如果解析成功,返回 dict 格式为:
{“tilemap service” : tilemap 节点 tilemapservice 属性的值 , ”title” : title 节点 的
值, ”tileset count” : tileset 节点的个数, ”tileset max” : tileset 节点中最大的 order 值(注
意是整数) }
对应到上表的 XML 文件,返回值为:
{“tilemap service” : "http://tms.osgeo.org/1.0.0", ”title” : “default”, ”tileset count” :
6, ”tileset max” : 5}
解析过程中, 如果缺少对应的值, 则该项不在字典中出现; 如果所有的值均不存在,
就返回空的字典。
 

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 导入minidom
from xml.dom import minidom

def create_xml(path):#path文件保存路径,包含文件名
    pass
    # 1.创建DOM树对象
    dom = minidom.Document ()
    # 2.创建根节点。每次都要用DOM对象来创建任何节点。
    root_node = dom.createElement ('tilemap')
    root_node.setAttribute ('tilemapservice', 'http://tms.osgeo.org/1.0.0')
    root_node.setAttribute ('version', '1.0.0')
    # 3.用DOM对象添加根节点
    dom.appendChild (root_node)

    # 用DOM对象创建元素子节点
    title_node = dom.createElement ('title')
    title_text = dom.createTextNode ('default')
    title_node.appendChild (title_text)
    # 用父节点对象添加元素子节点
    root_node.appendChild (title_node)

    abstract_node = dom.createElement ('abstract')
    root_node.appendChild (abstract_node)

    srs_node = dom.createElement ('srs')
    srs_text = dom.createTextNode ('EPSG:4326')
    srs_node.appendChild (srs_text)
    root_node.appendChild (srs_node)
    vsrs_node = dom.createElement ('vsrs')
    root_node.appendChild (vsrs_node)
    boundingbox_node = dom.createElement ('boundingbox')
    boundingbox_node.setAttribute ('maxx', '180.0')
    boundingbox_node.setAttribute ('maxy', '90.0')
    boundingbox_node.setAttribute ('miny', '-90.0')
    root_node.appendChild (boundingbox_node)
    origin_node = dom.createElement ('origin')
    origin_node.setAttribute ('x', '-180.0')
    origin_node.setAttribute ('y', '90.0')
    root_node.appendChild (origin_node)
    tileformat_node = dom.createElement ('tilefomat')
    tileformat_node.setAttribute ('extension', 'tif')
    tileformat_node.setAttribute ('height', '17')
    tileformat_node.setAttribute ('mime-type', 'image/tiff')
    tileformat_node.setAttribute ('width', '17')
    root_node.appendChild (tileformat_node)
    tilesets_node = dom.createElement ('tilesets')
    tilesets_node.setAttribute ('profile', 'global-geodetic')
    root_node.appendChild (tilesets_node)
    tileset_node = dom.createElement ('tileset')
    tileset_node.setAttribute ('href', '')
    tileset_node.setAttribute ('order', '0')
    tileset_node.setAttribute ('units-per-pixel', '10.588')
    tilesets_node.appendChild (tileset_node)
    tileset_node = dom.createElement ('tileset')
    tileset_node.setAttribute ('href', '')
    tileset_node.setAttribute ('order', '1')
    tileset_node.setAttribute ('units-per-pixel', '5.294')
    tilesets_node.appendChild (tileset_node)
    tileset_node = dom.createElement ('tileset')
    tileset_node.setAttribute ('href', '')
    tileset_node.setAttribute ('order', '2')
    tileset_node.setAttribute ('units-per-pixel', '2.647')
    tilesets_node.appendChild (tileset_node)
    tileset_node = dom.createElement ('tileset')
    tileset_node.setAttribute ('href', '')
    tileset_node.setAttribute ('order', '3')
    tileset_node.setAttribute ('units-per-pixel', '1.323')
    tilesets_node.appendChild (tileset_node)
    tileset_node = dom.createElement ('tileset')
    tileset_node.setAttribute ('href', '')
    tileset_node.setAttribute ('order', '4')
    tileset_node.setAttribute ('units-per-pixel', '0.661')
    tilesets_node.appendChild (tileset_node)
    tileset_node = dom.createElement ('tileset')
    tileset_node.setAttribute ('href', '')
    tileset_node.setAttribute ('order', '5')
    tileset_node.setAttribute ('units-per-pixel', '0.331')
    tilesets_node.appendChild (tileset_node)

    try:
        with open (path, 'w', encoding='UTF-8') as fh:
            # 4.writexml()第一个参数是目标文件对象,第二个参数是根节点的缩进格式,第三个参数是其他子节点的缩进格式,
            # 第四个参数制定了换行格式,第五个参数制定了xml内容的编码。
            dom.writexml (fh, indent='', addindent='\t', newl='\n', encoding='UTF-8')
            print ('写入xml OK!')
    except Exception as err:
        print ('错误信息:{0}'.format (err))
###############################################################
def parse_xml(path):
    pass
    result={}
    dom=minidom.parse(path)#加载xml文件
    root = dom.documentElement
    tilemap_sevice=root._attrs['tilemapservice']._value
    result['tilemapservice'] = tilemap_sevice
    title_text=root.childNodes[1].childNodes[0]._data
    result['title']=title_text
    tileset_count=len(root.childNodes[15]._child_node_types)
    result['tileset count']=tileset_count
    order=0
    for i in range(tileset_count):
        i=i*2+1
        # print(i)
        num=int(root.childNodes[15].childNodes[i]._attrs['order'].value)
        if num>order:
            order=num
    result['order']=order
    return result


if __name__ == '__main__':
    pass
    path='.\dom_write.xml'#保存在当前路径下
    create_xml(path)
    result=parse_xml(path)
    print(result)

如果对您有帮助,请打赏!谢谢!

猜你喜欢

转载自blog.csdn.net/qq_24624539/article/details/86611885