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 相关文章推荐
Python中条件选择和循环语句使用方法介绍
Mar 13 Python
Python 错误和异常小结
Oct 09 Python
Python ORM框架SQLAlchemy学习笔记之关系映射实例
Jun 10 Python
python3.6使用urllib完成下载的实例
Dec 19 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
Oct 28 Python
python 实现绘制整齐的表格
Nov 18 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
Mar 16 Python
Django实现whoosh搜索引擎使用jieba分词
Apr 08 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
Sep 16 Python
pytorch 预训练模型读取修改相关参数的填坑问题
Jun 05 Python
Python机器学习实战之k-近邻算法的实现
Nov 27 Python
宝塔更新Python及Flask项目的部署
Apr 11 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中使用foreach和引用导致程序BUG的问题介绍
2012/09/05 PHP
Laravel 5+ .env环境配置文件详解
2020/04/06 PHP
PHP利用curl发送HTTP请求的实例代码
2020/07/09 PHP
How to Auto Include a Javascript File
2007/02/02 Javascript
javascript下function声明一些小结
2007/12/28 Javascript
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
javascript数组操作方法小结和3个属性详细介绍
2014/07/05 Javascript
Jquery 实现grid绑定模板
2015/01/28 Javascript
基于jquery实现select选择框内容左右移动添加删除代码分享
2015/08/25 Javascript
jQuery实现的简单拖拽功能示例
2016/09/13 Javascript
jquery事件绑定解绑机制源码解析
2016/09/19 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
js 奇葩技巧之隐藏代码
2017/08/11 Javascript
基于JQuery的Ajax方法使用详解
2017/08/16 jQuery
JS使用数组实现的队列功能示例
2019/03/04 Javascript
Element实现表格分页数据选择+全选所有完善批量操作
2019/06/07 Javascript
JavaScript中EventBus实现对象之间通信
2020/10/18 Javascript
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
Python解析树及树的遍历
2016/02/03 Python
Python下载指定页面上图片的方法
2016/05/12 Python
Python 专题六 局部变量、全局变量global、导入模块变量
2017/03/20 Python
Python实现的企业粉丝抽奖功能示例
2019/07/26 Python
python实现在一个画布上画多个子图
2020/01/19 Python
Django Session和Cookie分别实现记住用户登录状态操作
2020/07/02 Python
安装Anaconda3及使用Jupyter的方法
2020/10/27 Python
使用Python解析Chrome浏览器书签的示例
2020/11/13 Python
css3 旋转按钮 使用CSS3创建一个旋转可变色按钮
2012/12/31 HTML / CSS
优秀员工年终发言演讲稿
2014/01/01 职场文书
大学生学习党课思想汇报
2014/01/03 职场文书
捐款活动总结
2014/08/27 职场文书
校长新学期致辞
2015/07/30 职场文书
css之clearfix的用法深入理解(必看篇)
2023/05/21 HTML / CSS