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 装饰器功能以及函数参数使用介绍
Jan 27 Python
Python实现的科学计算器功能示例
Aug 04 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
May 30 Python
Python测试网络连通性示例【基于ping】
Aug 03 Python
python取数作为临时极大值(极小值)的方法
Oct 15 Python
Python父目录、子目录的相互调用方法
Feb 16 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
Aug 10 Python
python如何从文件读取数据及解析
Sep 19 Python
python socket 聊天室实例代码详解
Nov 14 Python
Python分析最近大火的网剧《隐秘的角落》
Jul 02 Python
python解决12306登录验证码的实现
Apr 18 Python
python代码实现备忘录案例讲解
Jul 26 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
第九节--绑定
2006/11/16 PHP
php中对2个数组相加的函数
2011/06/24 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
PHP SPL标准库中的常用函数介绍
2015/05/11 PHP
thinkPHP内置字符串截取函数用法详解
2016/11/15 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
图片之间的切换
2006/06/26 Javascript
Highslide.js是一款基于js实现的网页中图片展示插件
2020/03/30 Javascript
jQuery 借助插件Lavalamp实现导航条动态美化效果
2013/09/27 Javascript
javascript闭包入门示例
2014/04/30 Javascript
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
vue-router实现嵌套路由的讲解
2019/01/19 Javascript
微信小程序点击按钮动态切换input的disabled禁用/启用状态功能
2020/03/07 Javascript
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
2020/08/06 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
高性能web服务器框架Tornado简单实现restful接口及开发实例
2014/07/16 Python
Python多进程并发(multiprocessing)用法实例详解
2015/06/02 Python
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
Python第三方库的安装方法总结
2016/06/06 Python
浅谈python爬虫使用Selenium模拟浏览器行为
2018/02/23 Python
python 每天如何定时启动爬虫任务(实现方法分享)
2018/05/21 Python
深入flask之异步非堵塞实现代码示例
2018/07/31 Python
Django安装配置mysql的方法步骤
2018/10/15 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
Django如何在不停机的情况下创建索引
2020/08/02 Python
乌克兰网上珠宝商店:GoldSoveren
2020/03/31 全球购物
会计与审计毕业生自荐信范文
2013/12/30 职场文书
校长就职演讲稿
2014/01/06 职场文书
在校硕士自我鉴定
2014/01/23 职场文书
项目合作协议书
2014/04/16 职场文书
我的教育故事演讲稿
2014/05/04 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
银行客户经理岗位职责
2015/04/09 职场文书
房贷工资证明范本
2015/06/12 职场文书