Python和xml简介
python提供越来越多的技术来支持xml,本文旨在面向初学利用Python处理xml的读者,以教程的形式介绍一些基本的xml出来概念。前提是读者必须知道一些xml常用术语。
先决条件
本文所有的例子基于Python2.6.5,pyxml的最新版本为0.8.1, 该教程中的例子都需要导入minidom模块,所以在py文件中需要加入以下类似代码:
1
|
import xml.dom.minidom
|
当然,你也可以从minidom模块中只导入你需要的类。你可以使用以下代码来查看该模块的内容:
1
|
dir (xml.dom.minidom)
|
创建XML 文件
首先,正如前面所说的,导入minidom模块:
1
|
import xml.dom.minidom
|
要创建XML文件,我们需要Document这个对象的实例:
1
2
|
def get_a_document():
doc = xml.dom.minidom.Document()
|
当然这时候这个Document还没有任何内容,接下来我们将增加一些内容到文件中。
元素节点(Elements)
XML文件中有一个唯一的‘根元素节点’,其他子元素节点以及文本内容都是放在这个根元素的结构中。这里我们可以创建一个xml文件,用于描述一个 公司的某个部分,该文件的根元素节点命名为“business”,名字空间(namespace)设置 为:http://www.boddie.org.uk/paul/business。代码如下:
1
|
business_element = doc.createElementNS( "http://www.boddie.org.uk/paul/business" , "business" )
|
此刻我们已经创建了元素节点,但是还没有加入到Document中,我们需要把它添加到文档中:
1
|
doc.appendChild(business_element)
|
最后在函数末尾返回我们创建的对象:
1
|
return doc, business_element
|
为了便利,我把上面的代码综合起来:
1
2
3
4
5
|
def get_a_document():
doc = xml.dom.minidom.Document()
business_element = doc.createElementNS( "http://www.boddie.org.uk/paul/business" , "business" )
doc.appendChild(business_element)
return doc, business_element
|
执行完上面的函数,那么根元素节点已经被添加Document中,我们可以通过查询元素节点信息:
>>> doc, business_element = get_a_document() >>> doc.childNodes [<DOM Element: business at 0x20ad0d0>]
当然你可以查询这个节点列表里面的具体信息,
>>> doc.childNodes[0].namespaceURI 'http://www.boddie.org.uk/paul/business'
最后查看下我们给元素节点设置的名字空间:
>>> doc.childNodes[0].localName 'business'
business也就是我们刚才设置的根元素节点名字。有时候这个localName很重要,我们可以从中知道是公司的那个部门,同样我们也可以像刚才那样用一个函数来添加localName:
1
2
|
def add_a_location(doc, business_element):
location_element = doc.createElementNS( "http://www.boddie.org.uk/paul/business" , "location" )
|
添加元素节点作为子节点:
1
|
business_element.appendChild(location_element)
|
最后返回:
1
|
return location_element
|
有了以上这个函数,我们就可以向根元素节点添加新的元素节点:
>>> doc, business_element = get_a_document() >>> location_element = add_a_location(doc, business_element) >>> doc.childNodes [<DOM Element: business at 0x20dc5f8>]
同样我们也可以查看这个元素列表中更为详细的信息:
>>> doc.childNodes[0].namespaceURI 'http://www.boddie.org.uk/paul/business' >>> doc.childNodes[0].localName 'business'
文本
文本就是xml文件中的具体内容,通常被置于xml元素标签中。紧接着前面的例子,我们将添加元素节点”surrounding”作为location的子节点。作用就是用于描述location那个地方的周边环境。同样我们创建一个函数:
1
2
3
|
def add_surroundings(doc, location_element):
surroundings_element = doc.createElementNS( "http://www.boddie.org.uk/paul/business" , "surroundings" )
location_element.appendChild(surroundings_element)
|
然后添加文本内容:
1
|
description = doc.createTextNode( "A quiet, scenic park with lots of wildlife." )
|
把这个文本节点添加到surrounding中:
1
|
surroundings_element.appendChild(description)
|
返回对象:
1
|
return surroundings_element
|
我们可以从跟元素节点查询子节点信息:
>>> surroundings_element = add_surroundings(doc, location_element) >>> doc.childNodes[0].childNodes[0].childNodes[0].childNodes[0]
当然可以查看整个文本值:
>>> doc.childNodes[0].childNodes[0].childNodes[0].childNodes[0].nodeValue 'A quiet, scenic park with lots of wildlife.'
同样我们可以添加更多文本值:
1
2
3
|
def add_more_surroundings(doc, surroundings_element):
description = doc.createTextNode( " It's usually sunny here, too." )
surroundings_element.appendChild(description)
|
来验证下结果:
>>> add_more_surroundings(doc, surroundings_element) >>> surroundings_element.childNodes [, , ]
有时候我们需要把这段文本组合在一起,该如何做呢?
1
2
|
def fix_element(element):
element.normalize()
|
结果为:
>>> fix_element(surroundings_element) >>> surroundings_element.childNodes[0].nodeValue "A quiet, scenic park with lots of wildlife. It's usually sunny here, too. It's usually sunny here, too."
属性
xml 中的元素节点通常附带有属性。比如刚才的’location’节点还有一个属性叫做’building’,这个元素的属性名称叫做’name’.
1
2
|
def add_building ( doc , location_element ) :
building_element = doc.createElementNS ( "http://www.boddie.org.uk/paul/business" , "building" )
|
返回对象:
1
2
|
location_element.appendChild(building_element)
return building_element
|
这里我们注意到’building’同样作为’location’的字节点出现在’surrounding’之后。我们可以用如下方法确认:
>>> building_element = add_building(doc, location_element) >>> location_element.childNodes [<DOM Element: surroundings at 136727844>, <DOM Element: building at 136286548>]
这样之后我们可以直接添加属性:
1
2
|
def name_building(building_element):
building_element.setAttributeNS( "http://www.boddie.org.uk/paul/business" , "business:name" , "Ivory Tower" )
|
在名空间和元素节点以及文本值指定之后,我们还可以用以上方法添加其他属性:
>>> name_building(building_element) >>> building_element.getAttributeNS("http://www.boddie.org.uk/paul/business", "name") 'Ivory Tower'
写XML文档
当你处理好以上xml内容,通常需要保存起来,所以一般是把内容写入文件。一个简单的方式是使用另外一个模块:
1
2
|
import xml.dom.ext
import xml.dom.minidom
|
导入这两个模块,就有很多可用的函数和类,这里我们使用PrettyPrint函数输出标准的xml结构:
1
2
|
def write_to_screen(doc):
xml.dom.ext.PrettyPrint(doc)
|
具体用法:
>>> from XML_intro.Writing import * >>> write_to_screen(doc)
<?xml version='1.0' encoding='UTF-8'?> <business xmlns='http://www.boddie.org.uk/paul/business' xmlns:business='http://www.boddie.org.uk/paul/business'><location><surroundings>A quiet, scenic park with lots of wildlife.</surroundings><building business:name='Ivory Tower'/></location> </business>
以上只是打印在屏幕上,最后完成输出文件:
1
2
3
4
|
def write_to_file(doc, name = "/tmp/doc.xml" ):
file_object = open (name, "w" )
xml.dom.ext.PrettyPrint(doc, file_object)
file_object.close()
|
或者简单的:
1
2
|
def write_to_file_easier(doc, name = "/tmp/doc.xml" ):
xml.dom.ext.PrettyPrint(doc, open (name, "w" ))
|
>>> write_to_file(doc)
读XML文件
接下来讲如何读取上面保存的xml文件:
1
2
3
|
import xml.dom.minidom
def get_a_document(name = "/tmp/doc.xml" ):
return xml.dom.minidom.parse(name)
|
如果已经存在存在xml可读对象:
1
2
|
def get_a_document_from_file(file_object):
return xml.dom.minidom.parse(file_object)
|
更多资讯参考:http://www.boddie.org.uk/python/XML_intro.html
转载于:https://www.cnblogs.com/mmix2009/p/3220987.html
Python和xml简介相关推荐
- 用Python解析XML的几种常见方法的介绍
这篇文章主要介绍了用Python解析XML的几种常见方法,包括快速的使用ElementTree模块等方法的实例介绍,需要的朋友可以参考下 一.简介 XML(eXtensible Markup Lang ...
- Python爬虫——Scrapy 简介和安装
文章目录 Python爬虫--Scrapy 简介和安装 1.Scrapy 简介 2.Scrapy 下载安装 Python爬虫--Scrapy 简介和安装 1.Scrapy 简介 Scrapy 简介 S ...
- Python网络爬虫简介与环境配置
第一章 Python网络爬虫简介与环境配置 1.1 网络爬虫简介 随着互联网的快速发展越来越多的信息被发布到互联网上,这些信息被嵌入到各种各样的网页结构及样式中.虽然搜索引擎可以辅助用户搜索这些网页信 ...
- python:XML处理模块
python:XML处理模块 简介 XML 漏洞 defusedxml 包 简介 用于处理XML的Python接口分组在 xml 包中. 警告 XML 模块对于错误或恶意构造的数据是不安全的. 如果你 ...
- python读取xml文件报错ValueError: multi-byte encodings are not supported
1.在使用python对xml文件进行读取时,提示ValueError: multi-byte encodings are not supported 很多贴子上说把xml的编码格式改为,就可以正常执 ...
- python之XML文件解析
python对XML的解析 常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同. python有三种方法解析XML,分别是SAX,DOM,以及ElementT ...
- python包NiBabel对医学影像文件格式进行读写:python包NiBabel简介集示例
python包NiBabel对医学影像文件格式进行读写:python包NiBabel简介集示例 目录 python包NiBabel对医学影像文件格式进行读写:python包NiBabel简介集示例
- python 解析xml
在工作中很多时候都要用到xml,使用这个时候难免会设计到解析他,然后就研究了一下python解析xml问题,看了很多东西,python有很多解析xml的包,但是也折腾我好一段时间,最后选择了这个方法. ...
- 用python将xml文件转换为txt文件_python代码xml转txt实例
为了训练深度学习模型,经常要整理大量的标注数据,需统一不同格式的标注数据,一般情况下习惯读取TXT格式的数据.但实际中经常遇到XML格式的标注数据,在此举例:1.读取XML标注数据:2.写入TXT文件 ...
最新文章
- 什么是self-attention、Multi-Head Attention、Transformer
- 小甲鱼-累加数据段中的前3个字型数据【不对的话,请指教!】
- ftl不存在为真_LTL和FTL货运之间有什么区别?
- Oracle数据库的认证方法、用户管理、权限管理和角色管理等
- 如何快速创建程序组_如何快速开发小程序
- 研读代码必须掌握的五个Eclipse快捷键
- Web框架之Django_05 模型层了解(单表查询、多表查询、聚合查询、分组查询)
- OutputStreamWriter介绍代码实现
- Mycat配置文件schema.xml的详解
- centos 8 kubernetes安装详解_电力工程必学!8方面施工图文详解,电气安装工程施工工艺...
- 万物互联的根底就是嵌入式,小到智能手表,大到智能汽车,能落地的支撑之一就是嵌入式。
- css3 颜色 文本
- Android、IOS和Java三个平台一致的加密工具
- 单播、广播、组播的区别(转)
- 在3D空间中绘制四边形
- 蓝屏信息0x0000000A、 0x00000050、 0x0000001A错误分析
- Mac OS X 背后的故事(三)Mach之父Avie Tevanian 1
- 边缘计算初探:什么是边缘计算,它能做什么?
- RecyclerView之点击item变色
- 百度推出清风算法,SEO的标题该如何优化?