当前位置:  编程语言>python

python对XML的解析方法(SAX,DOM,ElementTree)介绍

 
    发布时间:2013-9-6  


    本文导语: python有三种方法解析XML:SAX,DOM,以及ElementTree,介绍如下1.SAX (simple API for XML ) pyhton 标准库包含SAX解析器,SAX是一种典型的极为快速的工具,在解析XML时,不会占用大量内存。但是这是基于回调机制的,因此在某些...

python有三种方法解析XML:SAXDOM,以及ElementTree,介绍如下


1.SAX (simple API for XML )

      pyhton 标准库包含SAX解析器,SAX是一种典型的极为快速的工具,在解析XML时,不会占用大量内存

但是这是基于回调机制的,因此在某些数据中,它会调用某些方法进行传递。这意味着必须为数据指定句柄,

以维持自己的状态,这是非常困难的。

2.DOM(Document Object Model)

      与SAX比较,DOM典型的缺点是比较慢,消耗更多的内存,因为DOM会将整个XML数读入内存中,并为树

中的第一个节点建立一个对象。使用DOM的好处是你不需要对状态进行追踪,因为每一个节点都知道谁是它的

父节点,谁是子节点。但是DOM用起来有些麻烦。

   常用的DOM操作方法:  

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.attributes["id"]
a.name #就是上面的 "id"
a.value #属性的值

3. ElementTree

    ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少,这里主要

介绍DOM和ElementTree。


代码举例


1. 下面是一个转载的例子,使用ElementTree:

test.xml如下:

<span style="font-size:13px;"><?xml version="1.0" encoding="utf-8"?> 
 <root>
  <person age="18">
    <name>hzj</name>
    <sex>man</sex>
 </person> 
  <person age="19" des="hello">
     <name>kiki</name>
     <sex>female</sex>
 </person>
</root></span>


1)加载xml文件

   加载XML文件共有2种方法,一是加载指定字符串,二是加载指定文件

2)获取element的方法

 a) 通过getiterator

 b) 过 getchildren

 c) find方法

 d) findall方法


#-*- coding:utf-8 -*- 
 from xml.etree import ElementTree 
 def print_node(node):
     '''打印结点基本信息'''
     print "=============================================="
     print "node.attrib:%s" % node.attrib 
     if node.attrib.has_key("age") > 0 : 
        print "node.attrib['age']:%s" % node.attrib['age'] 
     print "node.tag:%s" % node.tag 
     print "node.text:%s" % node.text 
 def read_xml(text): 
     '''读xml文件'''
     # 加载XML文件(2种方法,一是加载指定字符串,二是加载指定文件)     
     # root = ElementTree.parse(r"D:/test.xml") 
     root = ElementTree.fromstring(text) 
     # 获取element的方法 
     # 1 通过getiterator  
     lst_node = root.getiterator("person") 
     for node in lst_node: 
         print_node(node) 
     # 2通过 getchildren 
     lst_node_child = lst_node[0].getchildren()[0] 
     print_node(lst_node_child) 
     # 3 .find方法 
     node_find = root.find('person') 
     print_node(node_find) 
     #4. findall方法 
     node_findall = root.findall("person/name")[1] 
     print_node(node_findall) 
 if __name__ == '__main__': 
      read_xml(open("test.xml").read())

想想为什么?不明白,请看下面:

#encoding=utf-8 
from xml.etree import ElementTree as ET 
#要找出所有人的年龄 
per=ET.parse('test.xml') 
p=per.findall('/person') 
for x in p: 
    print x.attrib 
print
for oneper in p:  #找出person节点 
   for child in oneper.getchildren(): #找出person节点的子节点 
        print child.tag,':',child.text
   print 'age:',oneper.get('age') 
   print '############'

结果如下:

{'age': '18'} 
{'age': '19', 'des': 'hello'} 
name : hzj 
sex : man 
age: 18
############ 
name : kiki 
sex : female 
age: 19
############


2. 另外一个转载的例子,使用DOM:

XML文件:

<?xml version="1.0" encoding="UTF-8" ?>
<users>
    <user id="1000001">
        <username>Admin</username>
        <email>admin@</email>
        <age>23</age>
        <sex>男</sex>
    </user>
    <user id="1000002">
        <username>Admin2</username>
        <email>admin2@</email>
        <age>22</age>
        <sex>男</sex>
    </user>
    <user id="1000003">
        <username>Admin3</username>
        <email>admin3@</email>
        <age>27</age>
        <sex>男</sex>
    </user>
    <user id="1000004">
        <username>Admin4</username>
        <email>admin4@</email>
        <age>25</age>
        <sex>女</sex>
    </user>
    <user id="1000005">
        <username>Admin5</username>
        <email>admin5@</email>
        <age>20</age>
        <sex>男</sex>
    </user>
    <user id="1000006">
        <username>Admin6</username>
        <email>admin6@</email>
        <age>23</age>
        <sex>女</sex>
    </user>
</users>

示例代码如下:

# -*- coding:utf-8 -*-
"""
* User: lhj588
* Date: 11-11-9
* Time: 13:20
* Desc:
"""
from  xml.dom import  minidom
def get_attrvalue(node, attrname):
     return node.getAttribute(attrname) if node else ''
def get_nodevalue(node, index = 0):
    return node.childNodes[index].nodeValue if node else ''
def get_xmlnode(node,name):
    return node.getElementsByTagName(name) if node else []
def xml_to_string(filename='user.xml'):
    doc = minidom.parse(filename)
    return doc.toxml('UTF-8')
def get_xml_data(filename='user.xml'):
    doc = minidom.parse(filename)
    root = doc.documentElement
    user_nodes = get_xmlnode(root,'user')
    user_list=[]
    for node in user_nodes:
        user_id = get_attrvalue(node,'id')
        node_name = get_xmlnode(node,'username')
        node_email = get_xmlnode(node,'email')
        node_age = get_xmlnode(node,'age')
        node_sex = get_xmlnode(node,'sex')
        user_name =get_nodevalue(node_name[0]).encode('utf-8','ignore')
        user_email = get_nodevalue(node_email[0]).encode('utf-8','ignore')
        user_age = int(get_nodevalue(node_age[0]))
        user_sex = get_nodevalue(node_sex[0]).encode('utf-8','ignore')
        user = {}
        user['id'] , user['username'] , user['email'] , user['age'] , user['sex'] = (
            int(user_id), user_name , user_email , user_age , user_sex
        )
        user_list.append(user)
    return user_list
def test_xmltostring():
    print xml_to_string()
def test_laod_xml():
    user_list = get_xml_data()
    for user in user_list :
        #print user['sex']
        print '-----------------------------------------------------'
        if user:
            user_str='编   号:%dn用户名:%sn性   别:%sn年   龄:%sn邮   箱:%sn ' % (int(user['id']) , user['username'], user['sex'] , user['age'] , user['email'])
            print user_str
            print '====================================================='
if __name__ == "__main__":
    test_xmltostring()
    test_laod_xml()


  • 本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.
    转载请注明:文章转载自:[169IT-IT技术资讯]
    本文标题:python对XML的解析方法(SAX,DOM,ElementTree)介绍
相关文章推荐:
  • Python获取网页编码的方法及示例代码
  • 使用setup.py安装python包和卸载python包的方法
  • Python通过正则表达式获取,去除(过滤)或者替换HTML标签的几种方法
  • 如何运行Python程序的方法
  • Python3实现生成随机密码的方法
  • python list 合并连接字符串的方法
  • Python开发的单词频率统计工具wordsworth使用方法
  • Python实现多行注释的另类方法
  • Python判断变量是否已经定义的方法
  • python中定义结构体的方法
  • python字符串排序方法
  • 用Python脚本生成Android SALT扰码的方法
  • Python 条件判断的缩写方法
  • netbeans7安装python插件的方法图解
  • Python和php通信乱码问题解决方法
  • Python中无限元素列表的实现方法
  • win7 下搭建sublime的python开发环境的配置方法
  • SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
  • python中文乱码的解决方法
  • 在Python安装MySQL支持模块的方法
  • python中精确输出JSON浮点数的方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3