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

Python和xml简介的更多相关文章

  1. Python之xml文档及配置文件处理(ElementTree模块、ConfigParser模块)

    本节内容 前言 XML处理模块 ConfigParser/configparser模块 总结 一.前言 我们在<中我们描述了Python数据持久化的大体概念和基本处理方式,通过这些知识点我们已经 ...

  2. Python实现XML文件解析

    1. XML简介 XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用.它是web ...

  3. 【转】Python之xml文档及配置文件处理(ElementTree模块、ConfigParser模块)

    [转]Python之xml文档及配置文件处理(ElementTree模块.ConfigParser模块) 本节内容 前言 XML处理模块 ConfigParser/configparser模块 总结 ...

  4. python 生成 xml文件 属性的顺序问题

    需求很奇葩. 文档示例 <ITEM key="username" eng="User Name" chn="用户名" val=&quo ...

  5. XML 参考:XML基础 XML 简介

    XML 参考:XML基础 -- XML简介和用途 转:http://www.cnblogs.com/Dlonghow/archive/2009/01/22/1379799.html XML 参考:XM ...

  6. python读取xml文件

    关于python读取xml文章很多,但大多文章都是贴一个xml文件,然后再贴个处理文件的代码.这样并不利于初学者的学习,希望这篇文章可以更通俗易懂的教如何使用python 来读取xml 文件. 什么是 ...

  7. Python生态环境简介[转]

    Python生态环境简介 作者: Mir Nazim 原文: Python Ecosystem - An Introduction 译者: dccrazyboy  原译: Python生态环境简介 当 ...

  8. python 解析XML python模块xml.dom解析xml实例代码

    分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...

  9. python解析xml模块封装代码

    在python中解析xml文件的模块用法,以及对模块封装的方法.原文转自:http://www.jbxue.com/article/16586.html 有如下的xml文件:<?xml vers ...

随机推荐

  1. WPF DataGrid、ListView 简单绑定

    DataGrid运行效果: xaml 代码: DataGridName= dtgData ItemsSource= {Binding} AutoGenerateColumns= False DataG ...

  2. python 面试题(2)

    1.Python是如何进行内存管理的? 答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制 一.对象的引用计数机制 Python内部使用引用计数,来保持追踪内存中的对象,所有对象都 ...

  3. python实现堆栈、队列

    一.利用python列表实现堆栈和队列 堆栈: 堆栈是一个后进先出的数据结构,其工作方式就像生活中常见到的直梯,先进去的人肯定是最后出. 我们可以设置一个类,用列表来存放栈中的元素的信息,利用列表的a ...

  4. 知问前端——cookie插件

    Cookie是网站用来在客户端保存识别用户的一种小文件.一般可以保存用户登录信息.购物数据信息等一系列微小信息. 一.使用cookie插件 官方网站:http://plugins.jquery.com ...

  5. 【Codeforces441E】Valera and Number [DP]

    Valera and Number Time Limit: 20 Sec  Memory Limit: 512 MB Description Input Output Sample Input 5 3 ...

  6. 洛谷P2868 [USACO07DEC]观光奶牛 Sightseeing Cows

    题目描述 Farmer John has decided to reward his cows for their hard work by taking them on a tour of the ...

  7. quick 用系统浏览器打开url

    需求描述: 在我们的游戏里面增加一个链接,直接用浏览器打开,进入到对应网站,进行一些支付活动. 解决: 于是我去百度了一下,发现了这篇文章,http://blog.csdn.net/teng_onth ...

  8. 4 Values whose Sum is 0 POJ 2785 (折半枚举)

    题目链接 Description The SUM problem can be formulated as follows: given four lists A, B, C, D of intege ...

  9. 在使用ubuntu16.04+python3.5 下使用pip3出现pip3 error - '_NamespacePath' object has no attribute 'sort'

    使用pip3安装tensorflow以及gensim等时,出现如下错误: Traceback (most recent call last): File "/usr/local/bin/pi ...

  10. 使用EL表达式需要注意的

    1.表达式与Java无关,表达式都是以${开始,以}结束. 2.EL访问java变量不能直接访问,因为得不到数据,要访问数据,需要将其放到作用域中.而使用<%=java变量%>可以访问ja ...