利用 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)
如果对您有帮助,请打赏!谢谢!