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
|
|
此刻我们已经创建了元素节点,但是还没有加入到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() 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): |
添加元素节点作为子节点:
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 ) : |
返回对象:
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
Python和xml简介的更多相关文章
- Python之xml文档及配置文件处理(ElementTree模块、ConfigParser模块)
本节内容 前言 XML处理模块 ConfigParser/configparser模块 总结 一.前言 我们在<中我们描述了Python数据持久化的大体概念和基本处理方式,通过这些知识点我们已经 ...
- Python实现XML文件解析
1. XML简介 XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用.它是web ...
- 【转】Python之xml文档及配置文件处理(ElementTree模块、ConfigParser模块)
[转]Python之xml文档及配置文件处理(ElementTree模块.ConfigParser模块) 本节内容 前言 XML处理模块 ConfigParser/configparser模块 总结 ...
- python 生成 xml文件 属性的顺序问题
需求很奇葩. 文档示例 <ITEM key="username" eng="User Name" chn="用户名" val=&quo ...
- XML 参考:XML基础 XML 简介
XML 参考:XML基础 -- XML简介和用途 转:http://www.cnblogs.com/Dlonghow/archive/2009/01/22/1379799.html XML 参考:XM ...
- python读取xml文件
关于python读取xml文章很多,但大多文章都是贴一个xml文件,然后再贴个处理文件的代码.这样并不利于初学者的学习,希望这篇文章可以更通俗易懂的教如何使用python 来读取xml 文件. 什么是 ...
- Python生态环境简介[转]
Python生态环境简介 作者: Mir Nazim 原文: Python Ecosystem - An Introduction 译者: dccrazyboy 原译: Python生态环境简介 当 ...
- python 解析XML python模块xml.dom解析xml实例代码
分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...
- python解析xml模块封装代码
在python中解析xml文件的模块用法,以及对模块封装的方法.原文转自:http://www.jbxue.com/article/16586.html 有如下的xml文件:<?xml vers ...
随机推荐
- File file:/data1/hadoop/yarn/local/usercache/hp/appcache/application_* does not exi
AM Container for appattempt_1453292851883_0381_000002 exited with exitCode: -1000For more detailed o ...
- intellij idea 破解补丁激活
一.说明 idea激活可以用JetBrains account,Activation Code注册码或者填License server网址,使用注册码的方式可以参考lanyun提供的注册码,但是有效时 ...
- tcp/ip 学习-通过视频学习
视频下载地址:http://down.51cto.com/zt/5518/ http://www.icoolxue.com/album/show/328 每天可以拿两个番茄钟看视频,主要目的还是了解, ...
- Sass 基本特性-基础 笔记
一.变量声明 $ 变量的声明使用 $ 所有的变量必须声明到变量调用之前 从3.4版本开始,Sass已经可以正确处理作用域的概念 在局部范围声明一个已经存在于全局内的变量时,局部变量就会成为全 ...
- 【51NOD-0】1006 最长公共子序列Lcs
[算法]经典DP [题解]经典lcs,输出路径可以记录上一个有效节点就是有点麻烦. 因为开始时写法不太明确,打印结果时初始循环地方搞错了,后来修正写法时忘了改过来,调了好久. #include< ...
- js 基本类型&引用类型
1.基本的数据类型有:undefined,boolean,number,string,null.基本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值 基本类型的比较是值的比较.用==比较 ...
- this的九种常用场景(转子jb51.net)
[场景1]全局环境中的this指向全局对象 ; alert(a); b = ; alert( ; [场景2]对象内部函数的this指向调用函数的当前对象 ; var bar = { a: , test ...
- Object的公用方法们
如图所示,Object一共有10种方法: 下面详细描述: 1.public Object() 方法,默认构造函数方法,当新建一个Object对象的时候,调用这个方法向堆区申请一片内存: 2.priva ...
- SD卡 模拟SPI总线控制流程
SD卡为移动设备提供了安全的,大容量存储解决方法.它本身可以通过两种总线模式和MCU进行数据传输,一种是称为SD BUS的4位串行数据模式,另一种就是大家熟知的4线SPI Bus模式.一些廉价,低端的 ...
- Linux内核通知链分析【转】
转自:http://www.cnblogs.com/jason-lu/articles/2807758.html Linux内核通知链分析 1. 引言 Linux是单内核架构(monolithic k ...