【Python】xml 解析

1、XML:指可扩展标记语言,是一种标记语言,用于存储数据和传输数据,但没有像HTML那样具有预定义标签,需要程序猿自定义标签

2、XML的解析:读取XML数据结构中的某些信息,比如读取书的属性

3、XML注释格式为:

<!—注释内容-->

4、CDATA指不应由XML解析器进行解析的文本数据

<![CDATA[“我自己的代码”]]>

5、Python解析XML的是三种方法

(1)SAX逐行解析

(2)DOM对象,一次性读取全部,将内存存储到内存中,将XML存成一棵树

(3)ElementTree

6、Doc.toxml()获取xml文档函数,也就是文档内容

7、xml.dom解析xml常用api

Minidom.parse:该函数的作用是使用parse解析器打开xml文档,并将其解析为DOM文档,也就是内存中的一棵树,并得到这个DOM对象。

【Python】xml 解析

【Python】xml 解析

8、node.hasAttribute()判断属性在不在

9、node.hasAttribute()获取节点的某个属性值

10、doc.documentElement获取xml文档对象,就是拿到DOM树的根

11、node.getElementsByTagName(name)获取XML文档中某个父节点下具有相同节点名的节点对象集合,是一个list对象。

12、hasChildNodes()判断是否存在叶子结点

【Python】xml 解析

13、node.childNodes返回节点node下所有子节点组成的list

【Python】xml 解析

节点:0,2,4,6是回车文本节点;1,3,5是标签节点

【Python】xml 解析

【Python】xml 解析

#练习:自定义一个xml文件,包含数据库的ip地址,用户名、密码和数据库名称,将它从xml中读取出来,放到一个List里面

from xml.dom.minidom import parse

domtree=parse("e:\ip.xml")

treelist=domtree.documentElement

ipaddress=treelist.getElementsByTagName("ip")

lst=[]

for i in range(1,6,2):

tag_name=ipaddress[0].childNodes[i].tagName

tag_content=ipaddress[0].childNodes[i].childNodes[0].data

lst.append(tag_name+":"+tag_content)

print lst

for i in lst:

print i

#练习:xml解析

#从xml.dom.minidom模块引入解析器parse

from xml.dom.minidom import parse

#minidom解析器打开xml文档并将其解析为内存中的一棵树

DOMTree = parse(r"e:\test.xml")

print type(DOMTree) #instance对象

#获取xml文档对象,就是拿到树的根

booklist = DOMTree.documentElement #DOM对象

print u"DOM树的根对象:",booklist

if booklist.hasAttribute("type") :

#判断根节点booklist是否有type属性

print u"booklist元素存在type属性"

else :

print u"booklist元素不存在type属性"

if booklist.hasAttribute("type") :

#判断根节点booklist是否有type属性,有则获取并打印属性的值

print "Root element is", booklist.getAttribute("type")

print type(booklist.getAttribute("type"))

print u"xml文档内容:\n%s" %DOMTree.toxml()

#获取booklist对象中所有book节点的list集合

books = booklist.getElementsByTagName("book")

print type(books)

print books

print "*"*30

#获取booklist对象中所有author节点的list集合

author=booklist.getElementsByTagName("author")

print author

print "*"*30

#获取所有子节点

print books[0].childNodes

print "*"*30

#获取节点名称和文本放到一个字典中

d={}

for i in range(1,6,2):

tag_name = books[1].childNodes[i].tagName

d[tag_name] = books[1].childNodes[i].childNodes[0].data

print d

for k,v in d.items():

print k,v

print "*"*30

books = booklist.getElementsByTagName("book")

print u"book节点的个数:", books.length

print books[0]

if books[0].hasChildNodes():

print u"存在叶子节点\n", books[0].childNodes

else :

print u"不存在叶子节点"

print "*"*30

#练习:xml解析

from xml.dom.minidom import parse

import xml.dom.minidom

# 使用minidom解析器打开 XML 文档

DOMTree = xml.dom.minidom.parse(r"e:\\movie.xml")

collection = DOMTree.documentElement

if collection.hasAttribute("shelf"):

print "Root element : %s" % collection.getAttribute("shelf")

# 在集合中获取所有电影

movies = collection.getElementsByTagName("movie")

# 打印每部电影的详细信息

for movie in movies:

print "*****Movie*****"

if movie.hasAttribute("title"):

print "Title: %s" % movie.getAttribute("title")

type = movie.getElementsByTagName('type')[0] #[0]表示第一个title标签,因为一个<book>...</book>之间可能会

#定义多个title标签

print "Type: %s" % type.childNodes[0].data

format = movie.getElementsByTagName('format')[0]

print "Format: %s" % format.childNodes[0].data

rating = movie.getElementsByTagName('rating')[0]

print "Rating: %s" % rating.childNodes[0].data

description = movie.getElementsByTagName('description')[0]

print "Description: %s" % description.childNodes[0].data