热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python3.2读写xml(xml.etree.ElementTree,xml.dom)

示例所用到的xml文件book.xmlBookmessage

示例所用到的xml文件 book.xml



Book message

bookone
python check
001
200


booktwo
python learn
002
300

xml.etree.ElementTree篇

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的值:

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方法找到指定的第一个节点:

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方法将找到指定的所有节点:

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进行解析的实例

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
====================

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)创建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

运行结果为:

[, , , , , , ]

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

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

 

运行结果为:

intro None

C、访问第一个节点

print root.firstChild.nodeName

运行结果为:

#text

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

《python3.2 读写 xml( xml.etree.ElementTree,xml.dom )》

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 代码如下:

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

方法二:

代码:

#
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:

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文件。

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一样。

 

注意:

当要获取属性值时,如list id=’001’,用attrib方法。

当要获取节点值时,如bookone中的bookone用text方法。

当要获取节点名时,用tag方法。


推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • vue使用
    关键词: ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
author-avatar
小谢blue
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有