解析文档
<?xml version="1.0" encoding="utf-8" ?>
<!--this is a test about xml.-->
<booklist type="science and engineering">
<book category="math">
<title>learning math</title>
<author>张三</author>
<pageNumber>561</pageNumber>
</book>
<book category="Python">
<title>learning Python</title>
<author>李四</author>
<pageNumber>600</pageNumber>
</book>
</booklist>
解析原理
将要解析文档一次性读取,在内存中创建一棵XML文档树,文档树提供了一系列方法可获取树的每个节点和属性
解析步骤
第一步:读取XML文档
导入xml.dom.minidom包中的parse方法,生成XML文档树对象:
如下:
from xml.dom.minidom import parse
doc=parse(r'C:\Users\libai\Desktop\xml1\book.xml')print doc
结果:生成了一个Document对象
<xml.dom.minidom.Document instance at 0x0000000002703B48>
第二部:获取根节点及节点属性
通过【文本树对象.DocumentElement】方法获取根节点;通过【节点.getAttribute(属性名)】获取节点属性
如下:
from xml.dom.minidom import parse
doc=parse(r'C:\Users\libai\Desktop\xml1\book.xml')
booklist=doc.documentElement#获取根节点方法
if booklist.hasAttribute('type'):#判断节点是否包含type属性
type=booklist.getAttribute('type')#获取booklist节点的type属性
print booklist
print type
结果:生成根节点,并打印属性值
<DOM Element: booklist at 0x27f3cc8>
science and engineering
第三步,获取标签节点
通过【节点.getElementsByTagName(节点名称)】方法获取节点;这个方法返回了一个list对象,将节点下面的所有与节点名称参数匹配的节点全部取出,放入一个list数组中。
from xml.dom.minidom import parse
doc=parse(r'C:\Users\libai\Desktop\xml1\book.xml')
booklist=doc.documentElement
print doc.getElementsByTagName('booklist')#获取doc文档树下面节点名称为booklist的节点
print booklist.getElementsByTagName('book')#获取booklist下面节点名称为book的节点,由于booklist中有两个book标签,所有结果返回了两个
结果:
[<DOM Element: booklist at 0x2653cc8>]
[<DOM Element: book at 0x2653e48>, <DOM Element: book at 0x265f448>]
第四部,获取子节点
通过[【点.childNodes】获取子节点,返回的是一个列表
from xml.dom.minidom import parse
doc=parse(r'C:\Users\libai\Desktop\xml1\book.xml')
books=doc.getElementsByTagName('book')
book_1=books[0]
book_1_detail=book_1.childNodes#获取子节点方法
j=0
for i in book_1_detail:
j+=1
print '第%d个book标签的子节点为:'%j ,i
结果:
第1个book标签的子节点为: <DOM Text node "u'\n '">
第2个book标签的子节点为: <DOM Element: title at 0x27bf048>
第3个book标签的子节点为: <DOM Text node "u'\n '">
第4个book标签的子节点为: <DOM Element: author at 0x27bf148>
第5个book标签的子节点为: <DOM Text node "u'\n '">
第6个book标签的子节点为: <DOM Element: pageNumber at 0x27bf248>
第7个book标签的子节点为: <DOM Text node "u'\n '">
以上可以看到第一本书共有7个子节点,分别为:
<book category="math">第一个子节点为文本节点\n
<title第二个子节点为标签节点title>learning math</title>第三个子节点为文本节点\n
<author第四个子节点为标签节点title>张三</author>第五个子节点为文本节点\n
<pageNumber第六个子节点为标签节点pageNumber>561</pageNumber>第七个子节点为文本节点\n
</book>
第五步,获取文本节点
比如:获取第一本的是title值
from xml.dom.minidom import parse
doc=parse(r'C:\Users\libai\Desktop\xml1\book.xml')
titles=doc.getElementsByTagName('title')#获取文档中所有的title节点列表
title1=titles[0]#取出第一个title节点
title1_son=title1.childNodes
print title1_son#获取第一个title节点的子节点列表
print title1_son[0].data#获取文本节点的值
结果:
[<DOM Text node "u'learning m'...">]
learning math
案例解析:
解析movie.xml文档实例:
<!-- this is a test about xml. -->
<collection shelf="New Arrivals">
<movie title="Enemy Behind">
<type>War, Thriller</type>
<format>DVD</format>
<year>2003</year>
<rating>PG</rating>
<stars>10</stars>
<description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers">
<type>Anime, Science Fiction</type>
<format>DVD</format>
<year>1989</year>
<rating>R</rating>
<stars>8</stars>
<description>A schientific fiction</description>
</movie>
<movie title="Trigun">
<type>Anime, Action</type>
<format>DVD</format>
<episodes>4</episodes>
<rating>PG</rating>
<stars>10</stars>
<description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar">
<type>Comedy</type>
<format>VHS</format>
<rating>PG</rating>
<stars>2</stars>
<description>Viewable boredom</description>
</movie>
</collection>
代码如下:
#coding=utf-8
from xml.dom.minidom import parse
doc=parse(r'路径\movie.xml')
root=doc.documentElement
root_atr=root.getAttribute('shelf')
print 'root节点为:',root,'属性为:',root_atr#解析的内容为unicode字符
movies=root.getElementsByTagName('movie')
for i in movies:
print '*******************'
for j in range(len(i.childNodes)):
if j%2!=0:
print i.childNodes[j].tagName,":",i.childNodes[j].childNodes[0].data