XML生成与解析DOM、ElementTree

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</>
    list id='001'>
        head>bookonename>python checknumber>001page>200list>

    ='002'>booktwo>python learn>002>300>

>

(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子节点列表

') root=dom1.documentElement #print root.nodeName,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可以使用下面的方法

intro)[0] for node in node.childNodes: if node.nodeType (node.TEXT_NODE,node.CDATA_SECTION_NODE): print node.data

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

Book message

二、XML解析

对上面的xml进行解析

方法1 代码如下:

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

运行结果为:

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

方法二:

代码

xml 解析 head:'+booklist.getElementsByTagName(head)[0].childNodes[0].nodeValue.strip() name:namenumber:numberpage:page')[0].childNodes[0].nodeValue.strip()

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

解析

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 -*-xml 创建 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" 得到根节点 books=[{': ubookone',0); line-height:1.5!important; font-family:'Courier New'!important; font-size:12px!important">200001python check'},{booktwo300002python learn}] for book books: sNode=doc.createElement() sNode.setAttribute(])) headNode=create_element(doc,book[]) nameNode=create_element(doc,0); line-height:1.5!important; font-family:'Courier New'!important; font-size:12px!important">]) numberNode=create_element(doc,0); line-height:1.5!important; font-family:'Courier New'!important; font-size:12px!important">]) pageNode=create_element(doc,0); line-height:1.5!important; font-family:'Courier New'!important; font-size:12px!important">]) sNode.appendChild(headNode) sNode.appendChild(nameNode) sNode.appendChild(pageNode) top_element.appendChild(sNode) 将遍历的节点添加到根节点下 xmlfile=open(bookdate.xmlw) doc.writexml(xmlfile,addindent=' '*4,newl=\nutf-8) xmlfile.close()

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

xml.etree.ElementTree篇

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

1、加载XML

方法一:直接加载文件

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

方法二:加载指定字符串

xml.etree.ElementTree root = xml.etree.ElementTree.fromstring(xmltext)

这里xmltext是指定的字符串。

2、获取节点

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

book_node=root.getiterator(")

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

@小五义 http://www.cnblogs.com/xiaowuyi
)
book_node=root.getiterator( book_node:
    book_node_child=node.getchildren()[0]
    print book_node_child.tag+':'+book_node_child.text

运行结果为:

head:bookone
head:booktwo

方法三 使用find和findall方法

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

@小五义 http://www.cnblogs.com/xiaowuyi ) book_find=root.find(for note book_find: print note.tag+'+note.text

运行结果:

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

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

) book=root.findall(for book_list book: book_list:

运行结果:

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

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

if book_list.attrib.has_key(): "+book_list.attrib[] '+note.text '*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方法




相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念