python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)


Posted in Python onJune 09, 2014

xml.dom篇

    DOM是Document Object Model的简称,XML 文档的高级树型表示。该模型并非只针对 Python,而是一种普通XML 模型。Python 的 DOM 包是基于 SAX 构建的,并且包括在 Python 2.0 的标准 XML 支持里。

一、xml.dom的简单介绍

1、主要方法:

minidom.parse(filename):加载读取XML文件
doc.documentElement:获取XML文档对象
node.getAttribute(AttributeName):获取XML节点属性值
node.getElementsByTagName(TagName):获取XML节点对象集合
node.childNodes :返回子节点列表。
node.childNodes[index].nodeValue:获取XML节点值
node.firstChild:访问第一个节点,等价于pagexml.childNodes[0]
返回Node节点的xml表示的文本:
doc = minidom.parse(filename)
doc.toxml('UTF-8')

访问元素属性:

Node.attributes["id"]
a.name #就是上面的 "id"
a.value #属性的值 

2、举例说明

例1:文件名:book.xml

<?xml version="1.0" encoding="utf-8"?>
<info>
   <intro>Book message</intro>
    <list id='001'>
        <head>bookone</head>
        <name>python check</name>
        <number>001</number>
        <page>200</page>
    </list>
    <list id='002'>
        <head>booktwo</head>
        <name>python learn</name>
        <number>002</number>
        <page>300</page>
    </list>
</info>

(1)创建DOM对象

import xml.dom.minidom
dom1=xml.dom.minidom.parse('book.xml')

(2)获取根字节

root=dom1.documentElement #这里得到的是根节点
print root.nodeName,',',root.nodeValue,',',root.nodeType

返回结果为:

info , None , 1

其中:

info是指根节点的名称root.nodeName
None是指根节点的值root.nodeValue

1是指根节点的类型root.nodeType,更多节点类型如下表:

NodeType Named Constant
1 ELEMENT_NODE
2 ATTRIBUTE_NODE
3 TEXT_NODE
4 CDATA_SECTION_NODE
5 ENTITY_REFERENCE_NODE
6 ENTITY_NODE
7 PROCESSING_INSTRUCTION_NODE
8 COMMENT_NODE
9 DOCUMENT_NODE
10 DOCUMENT_TYPE_NODE
11 DOCUMENT_FRAGMENT_NODE
12 NOTATION_NODE

(3)子元素、子节点的访问

A、返回root子节点列表

import xml.dom.minidom
dom1=xml.dom.minidom.parse('book.xml')
root=dom1.documentElement
#print root.nodeName,',',root.nodeValue,',',root.nodeType
print root.childNodes

运行结果为:

[<DOM Text node "u'\n   '">, <DOM Element: intro at 0x124ef58>, <DOM Text node "u'\n    '">, <DOM Element: list at 0x1254058>, <DOM Text node "u'\n\n    '">, <DOM Element: list at 0x1254418>, <DOM Text node "u'\n\n'">]

B、获取XML节点值,如返回根节点下第二个子节点intro的值和名字,添加下面一句

print root.childNodes[1].nodeName,root.childNodes[1].nodeValue

运行结果为:

intro None

C、访问第一个节点

print root.firstChild.nodeName

运行结果为:

#text

D、获取已经知道的元素名字的值,如要获取intro后的book message可以使用下面的方法:

import xml.dom.minidom
dom1=xml.dom.minidom.parse('book.xml')
root=dom1.documentElement
#print root.nodeName,',',root.nodeValue,',',root.nodeType
node= root.getElementsByTagName('intro')[0]
for node in node.childNodes:
    if node.nodeType in (node.TEXT_NODE,node.CDATA_SECTION_NODE):
        print node.data

这种方法的不足之处是需要对类型进行判断,使用起来不是很方便。运行结果是:

Book message

二、xml解析

对上面的xml进行解析

方法1 代码如下:

#@小五义 http://www.cnblogs.com/xiaowuyi
#xml 解析
import xml.dom.minidom
dom1=xml.dom.minidom.parse('book.xml')
root=dom1.documentElement
book={}
booknode=root.getElementsByTagName('list')
for booklist in booknode:
    print '='*20
    print 'id:'+booklist.getAttribute('id')
    for nodelist in  booklist.childNodes:
        if nodelist.nodeType ==1:
            print nodelist.nodeName+':',
        for node in nodelist.childNodes:
            print node.data

运行结果为:

====================
id:001
head: bookone
name: python check
number: 001
page: 200
====================
id:002
head: booktwo
name: python learn
number: 002
page: 300

方法二:

代码:

#@小五义 http://www.cnblogs.com/xiaowuyi
#xml 解析 
import xml.dom.minidom
dom1=xml.dom.minidom.parse('book.xml')
root=dom1.documentElement
book={}
booknode=root.getElementsByTagName('list')
for booklist in booknode:
    print '='*20
    print 'id:'+booklist.getAttribute('id')
    print 'head:'+booklist.getElementsByTagName('head')[0].childNodes[0].nodeValue.strip()
    print 'name:'+booklist.getElementsByTagName('name')[0].childNodes[0].nodeValue.strip()
    print 'number:'+booklist.getElementsByTagName('number')[0].childNodes[0].nodeValue.strip()
    print 'page:'+booklist.getElementsByTagName('page')[0].childNodes[0].nodeValue.strip()

 运行结果与方法一一样。比较上面的两个方法,方法一根据xml的树结构进行了多次循环,可读性上不及方法二,方法直接对每一个节点进行操作,更加清晰。为了更加方法程序的调用,可以使用一个list加一个字典进行存储,具体见方法3:

#@小五义 http://www.cnblogs.com/xiaowuyi
#xml 解析 
import xml.dom.minidom 
dom1=xml.dom.minidom.parse('book.xml') 
root=dom1.documentElement 
book=[] 
booknode=root.getElementsByTagName('list') 
for booklist in booknode: 
    bookdict={} 
    bookdict['id']=booklist.getAttribute('id') 
    bookdict['head']=booklist.getElementsByTagName('head')[0].childNodes[0].nodeValue.strip() 
    bookdict['name']=booklist.getElementsByTagName('name')[0].childNodes[0].nodeValue.strip() 
    bookdict['number']=booklist.getElementsByTagName('number')[0].childNodes[0].nodeValue.strip() 
    bookdict['page']=booklist.getElementsByTagName('page')[0].childNodes[0].nodeValue.strip() 
    book.append(bookdict) 
print book

运行结果为:

[{'head': u'bookone', 'page': u'200', 'number': u'001', 'id': u'001', 'name': u'python check'}, {'head': u'booktwo', 'page': u'300', 'number': u'002', 'id': u'002', 'name': u'python learn'}]

该列表里包含了两个字典。

三、建立XML文件
这里用方法三得到的结果,建立一个xml文件。

# -*- coding: cp936 -*-
#@小五义 http://www.cnblogs.com/xiaowuyi
#xml 创建 
import xml.dom
def create_element(doc,tag,attr):
    #创建一个元素节点
    elementNode=doc.createElement(tag)
    #创建一个文本节点
    textNode=doc.createTextNode(attr)
    #将文本节点作为元素节点的子节点
    elementNode.appendChild(textNode)
    return elementNode
dom1=xml.dom.getDOMImplementation()#创建文档对象,文档对象用于创建各种节点。
doc=dom1.createDocument(None,"info",None)
top_element = doc.documentElement# 得到根节点
books=[{'head': u'bookone', 'page': u'200', 'number': u'001', 'id': u'001', 'name': u'python check'}, {'head': u'booktwo', 'page': u'300', 'number': u'002', 'id': u'002', 'name': u'python learn'}]
for book in books:
    sNode=doc.createElement('list')
    sNode.setAttribute('id',str(book['id']))
    headNode=create_element(doc,'head',book['head'])
    nameNode=create_element(doc,'name',book['name'])
    numberNode=create_element(doc,'number',book['number'])
    pageNode=create_element(doc,'page',book['page'])
    sNode.appendChild(headNode)
    sNode.appendChild(nameNode)
    sNode.appendChild(pageNode)
    top_element.appendChild(sNode)# 将遍历的节点添加到根节点下
xmlfile=open('bookdate.xml','w')
doc.writexml(xmlfile,addindent=' '*4, newl='\n', encoding='utf-8')
xmlfile.close()

运行后生成bookdate.xml文件,该文件与book.xml一样。

 xml.etree.ElementTree篇

依然使用例1的例子,对xml进行解析分析。

1、加载XML

方法一:直接加载文件

import xml.etree.ElementTree
root=xml.etree.ElementTree.parse('book.xml')

方法二:加载指定字符串

import xml.etree.ElementTree
root = xml.etree.ElementTree.fromstring(xmltext)这里xmltext是指定的字符串。

2、获取节点

方法一 利用getiterator方法得到指定节点

book_node=root.getiterator("list")

方法二 利用getchildren方法得到子节点,如例1中,要得到list下面子节点head的值:

#@小五义 http://www.cnblogs.com/xiaowuyiimport xml.etree.ElementTree
root=xml.etree.ElementTree.parse('book.xml')
book_node=root.getiterator("list")
for node in book_node:
    book_node_child=node.getchildren()[0]
    print book_node_child.tag+':'+book_node_child.text

运行结果为:

head:bookone
head:booktwo

方法三 使用find和findall方法

 find方法找到指定的第一个节点:

# -*- coding: cp936 -*-
#@小五义 
import xml.etree.ElementTree
root=xml.etree.ElementTree.parse('book.xml')
book_find=root.find('list')
for note in book_find:
    print note.tag+':'+note.text

运行结果:

head:bookone
name:python check
number:001
page:200

findall方法将找到指定的所有节点:

# -*- coding: cp936 -*-
#@小五义 
import xml.etree.ElementTree
root=xml.etree.ElementTree.parse('book.xml')
book=root.findall('list')
for book_list in book:
    for note in book_list:
        print note.tag+':'+note.text

运行结果:

head:bookone
name:python check
number:001
page:200
head:booktwo
name:python learn
number:002
page:300

3、对book.xml进行解析的实例

# -*- coding: cp936 -*-
#@小五义 
import xml.etree.ElementTree
root=xml.etree.ElementTree.parse('book.xml')
book=root.findall('list')
for book_list in book:
    print '='*20
    if  book_list.attrib.has_key('id'):
        print "id:"+book_list.attrib['id']
    for note in book_list:
        print note.tag+':'+note.text
print '='*20

运行结果为:

====================
id:001
head:bookone
name:python check
number:001
page:200
====================
id:002
head:booktwo
name:python learn
number:002
page:300
====================

注意:
当要获取属性值时,如list id='001',用attrib方法。
当要获取节点值时,如<head>bookone</head>中的bookone用text方法。
当要获取节点名时,用tag方法。

Python 相关文章推荐
wxpython学习笔记(推荐查看)
Jun 09 Python
Python Flask前后端Ajax交互的方法示例
Jul 31 Python
python实现抖音点赞功能
Apr 07 Python
Python3中的bytes和str类型详解
May 02 Python
Python学习笔记之集合的概念和简单使用示例
Aug 22 Python
Python函数的定义方式与函数参数问题实例分析
Dec 26 Python
使用tensorflow DataSet实现高效加载变长文本输入
Jan 20 Python
Python如何避免文件同名产生覆盖
Jun 09 Python
Keras实现DenseNet结构操作
Jul 06 Python
python音频处理的示例详解
Dec 23 Python
Pandas之缺失数据的实现
Jan 06 Python
python基于tkinter制作m3u8视频下载工具
Apr 24 Python
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
Jun 09 #Python
python网络编程学习笔记(六):Web客户端访问
Jun 09 #Python
python网络编程学习笔记(五):socket的一些补充
Jun 09 #Python
python网络编程学习笔记(四):域名系统
Jun 09 #Python
python网络编程学习笔记(三):socket网络服务器
Jun 09 #Python
python网络编程学习笔记(二):socket建立网络客户端
Jun 09 #Python
python网络编程学习笔记(一)
Jun 09 #Python
You might like
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
php中var_export与var_dump的区别分析
2010/08/21 PHP
PHP禁止个别IP访问网站
2013/10/30 PHP
浅谈PHP解析URL函数parse_url和parse_str
2014/11/11 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
2016/09/26 PHP
Prototype Template对象 学习
2009/07/19 Javascript
理解 JavaScript 预解析
2009/10/25 Javascript
一些有用的JavaScript和jQuery的片段分享
2011/08/23 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
js关于命名空间的函数实例
2015/02/05 Javascript
Sublime Text 3常用插件及安装方法
2015/12/16 Javascript
javascript自动恢复文本框点击清除后的默认文本
2016/01/12 Javascript
javascript 用函数实现继承详解
2016/05/28 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
Python psutil模块简单使用实例
2015/04/28 Python
Python中统计函数运行耗时的方法
2015/05/05 Python
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
Python中title()方法的使用简介
2015/05/20 Python
Java多线程编程中ThreadLocal类的用法及深入
2016/06/21 Python
python之Socket网络编程详解
2016/09/29 Python
python爬虫入门教程--优雅的HTTP库requests(二)
2017/05/25 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
Python+Appium实现自动化清理微信僵尸好友的方法
2021/02/04 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
教育课题研究自我鉴定范文
2013/12/28 职场文书
人事科岗位职责范本
2014/03/02 职场文书
反邪教警示教育方案
2014/05/13 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
预备党员群众路线教育实践活动思想汇报2014
2014/10/25 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
python 如何在 Matplotlib 中绘制垂直线
2021/04/02 Python
MySQL创建表操作命令分享
2022/03/25 MySQL