python中利用xml.dom模块解析xml的方法教程


Posted in Python onMay 24, 2017

一、什么是xml?有何特征?

xml即可扩展标记语言,它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

例子:del.xml

<?xml version="1.0" encoding="utf-8"?>
<catalog>
 <maxid>4</maxid>
 <login username="pytest" passwd='123456'>
  <caption>Python</caption>
  <item id="4">
   <caption>test</caption>
  </item>
 </login>
 <item id="2">
  <caption>Zope</caption>
 </item>
</catalog>

从结构上,很像HTML超文本标记语言。但他们被设计的目的是不同的,超文本标记语言被设计用来显示数据,其焦点是数据的外观。它被设计用来传输和存储数据,其焦点是数据的内容。

那么它有如下特征:

      •它是有标签对组成, <aa></aa>

      •标签可以有属性: <aa id='123'></aa>

      •标签对可以嵌入数据: <aa>abc</aa>

      •标签可以嵌入子标签(具有层级关系)

二、获得标签属性

#coding: utf-8
import xml.dom.minidom
dom = xml.dom.minidom.parse("del.xml") #打开xml文档

root = dom.documentElement    #得到xml文档对象
print "nodeName:", root.nodeName  #每一个结点都有它的nodeName,nodeValue,nodeType属性
print "nodeValue:", root.nodeValue  #nodeValue是结点的值,只对文本结点有效
print "nodeType:", root.nodeType
print "ELEMENT_NODE:", root.ELEMENT_NODE

nodeType是结点的类型。catalog是ELEMENT_NODE类型

现在有以下几种:

'ATTRIBUTE_NODE'

'CDATA_SECTION_NODE'

'COMMENT_NODE'

'DOCUMENT_FRAGMENT_NODE'

'DOCUMENT_NODE'

'DOCUMENT_TYPE_NODE'

'ELEMENT_NODE'

'ENTITY_NODE'

'ENTITY_REFERENCE_NODE'

'NOTATION_NODE'

'PROCESSING_INSTRUCTION_NODE'

'TEXT_NODE'

运行结果

nodeName: catalog

nodeValue: None

nodeType: 1

ELEMENT_NODE: 1

三、获得子标签

#coding: utf-8
import xml.dom.minidom
dom = xml.dom.minidom.parse("del.xml") 

root = dom.documentElement
bb = root.getElementsByTagName('maxid')
print type(bb)
print bb
b = bb[0]
print b.nodeName
print b.nodeValue

运行结果

<class 'xml.dom.minicompat.NodeList'>

[<DOM Element: maxid at 0x2707a48>]

maxid

None

四、获得标签属性值

#coding: utf-8
import xml.dom.minidom
dom = xml.dom.minidom.parse("del.xml") 

root = dom.documentElement
itemlist = root.getElementsByTagName('login')
item = itemlist[0]
print item.getAttribute("username")
print item.getAttribute("passwd")

itemlist = root.getElementsByTagName("item")
item = itemlist[0]     #通过在itemlist中的位置区分
print item.getAttribute("id") 

item2 = itemlist[1]     #通过在itemlist中的位置区分
print item2.getAttribute("id")

运行结果

pytest

123456

4

2

五、获得标签对之间的数据

#coding: utf-8
import xml.dom.minidom
dom = xml.dom.minidom.parse("del.xml") 

root = dom.documentElement
itemlist = root.getElementsByTagName('caption')

item = itemlist[0]
print item.firstChild.data

item2 = itemlist[1]
print item2.firstChild.data

运行结果

Python

test

六、例子

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

把name、email、age、sex输出

参考代码

# -*- coding:utf-8 -*-
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 get_xml_data(filename = 'user.xml'):
 doc = minidom.parse(filename) 
 root = doc.documentElement

 user_nodes = get_xmlnode(root, 'user')
 print "user_nodes:", user_nodes

 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])
  user_email = get_nodevalue(node_email[0])
  user_age = int(get_nodevalue(node_age[0]))
  user_sex = get_nodevalue(node_sex[0])

  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_load_xml():
 user_list = get_xml_data()
 for user in user_list :
  print '-----------------------------------------------------'
  if user:
   user_str='No.:\t%d\nname:\t%s\nsex:\t%s\nage:\t%s\nEmail:\t%s' % (int(user['id']) , user['username'], user['sex'] , user['age'] , user['email'])
   print user_str

if __name__ == "__main__":
 test_load_xml()

结果

C:\Users\wzh94434\Desktop\xml>python user.py

user_nodes: [<DOM Element: user at 0x2758c48>, <DOM Element: user at 0x2756288>,

 <DOM Element: user at 0x2756888>, <DOM Element: user at 0x2756e88>, <DOM Elemen

t: user at 0x275e4c8>, <DOM Element: user at 0x275eac8>]

-----------------------------------------------------

No.: 1000001

name: Admin

sex: boy

age: 23

Email: admin@live.cn

-----------------------------------------------------

No.: 1000002

name: Admin2

sex: boy

age: 22

Email: admin2@live.cn

-----------------------------------------------------

No.: 1000003

name: Admin3

sex: boy

age: 27

Email: admin3@live.cn

-----------------------------------------------------

No.: 1000004

name: Admin4

sex: gril

age: 25

Email: admin4@live.cn

-----------------------------------------------------

No.: 1000005

name: Admin5

sex: boy

age: 20

Email: admin5@live.cn

-----------------------------------------------------

No.: 1000006

name: Admin6

sex: gril

age: 23

Email: admin6@live.cn 

七、总结

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]

 

doc = minidom.parse(filename)

doc.toxml('UTF-8')

返回Node节点的xml表示的文本

 

Node.attributes["id"]

a.name #就是上面的 "id"

a.value #属性的值 

访问元素属性

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python3.2中的字符串函数学习总结
Apr 23 Python
Python基于smtplib实现异步发送邮件服务
May 28 Python
python搭建虚拟环境的步骤详解
Sep 27 Python
在python3.5中使用OpenCV的实例讲解
Apr 02 Python
python人民币小写转大写辅助工具
Jun 20 Python
kali中python版本的切换方法
Jul 11 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
Aug 09 Python
Python函数式编程指南:对生成器全面讲解
Nov 19 Python
利用python画出AUC曲线的实例
Feb 28 Python
Python列表推导式实现代码实例
Sep 09 Python
K近邻法(KNN)相关知识总结以及如何用python实现
Jan 28 Python
Python实战之大鱼吃小鱼游戏的实现
Apr 01 Python
Python实现简单过滤文本段的方法
May 24 #Python
django框架如何集成celery进行开发
May 24 #Python
python 计算两个日期相差多少个月实例代码
May 24 #Python
django基础之数据库操作方法(详解)
May 24 #Python
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
May 24 #Python
Python生成密码库功能示例
May 23 #Python
Python计算两个日期相差天数的方法示例
May 23 #Python
You might like
PHP初学者常见问题集合 修正版(21问答)
2010/03/23 PHP
PHP中如何定义和使用常量
2013/02/28 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
2013/08/09 PHP
PHP队列用法实例
2014/11/05 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
用JS实现一个TreeMenu效果分享
2011/08/28 Javascript
js获取多个tagname的节点数组
2013/09/22 Javascript
jquery高级编程的最佳实践详解
2014/03/23 Javascript
老生常谈jquery中detach()和remove()的区别
2017/03/02 Javascript
angular ng-click防止重复提交实例
2017/06/16 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
JavaScript实现美化滑块效果
2019/05/17 Javascript
vue页面引入three.js实现3d动画场景操作
2020/08/10 Javascript
jQuery实现简单弹幕制作
2020/12/10 jQuery
Vue使用Ref跨层级获取组件的步骤
2021/01/25 Vue.js
wxpython 学习笔记 第一天
2009/03/16 Python
python抓取网页中的图片示例
2014/02/28 Python
深入理解Javascript中的this关键字
2015/03/27 Python
flask中使用蓝图将路由分开写在不同文件实例解析
2018/01/19 Python
Python笔记之facade模式
2019/11/20 Python
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
Julep官网:美容产品和指甲油
2017/02/25 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
介绍下Java中==和equals的区别
2013/09/01 面试题
JPA的优势都有哪些
2013/07/04 面试题
资产经营总监岗位职责范文
2013/12/01 职场文书
教师辞职报告范文
2014/01/20 职场文书
《中国梦我的梦》中学生演讲稿
2014/08/20 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
党员干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年护士个人工作总结
2014/11/11 职场文书
特此通知格式
2015/04/27 职场文书
Python标准库之typing的用法(类型标注)
2021/06/02 Python
Redis+Lua脚本实现计数器接口防刷功能(升级版)
2022/02/12 Redis
一条慢SQL语句引发的改造之路
2022/03/16 MySQL
Python编写冷笑话生成器
2022/04/20 Python