通过python的dom包解析XML文档

解析文档

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











猜你喜欢

转载自blog.csdn.net/qq_32551117/article/details/79724737