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自动格式化json文件的方法
Mar 11 Python
举例讲解Python程序与系统shell交互的方式
Apr 09 Python
用Python编写脚本使IE实现代理上网的教程
Apr 23 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
Jun 27 Python
Python 获得命令行参数的方法(推荐)
Jan 24 Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 Python
python实现杨氏矩阵查找
Mar 02 Python
django rest framework vue 实现用户登录详解
Jul 29 Python
pygame实现俄罗斯方块游戏(AI篇2)
Oct 29 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
May 09 Python
Python tkinter之Bind(绑定事件)的使用示例
Feb 05 Python
详解Python中__new__方法的作用
Mar 31 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
浅谈Windows下 PHP4.0与oracle 8的连接设置
2006/10/09 PHP
用定制的PHP应用程序来获取Web服务器的状态信息
2006/10/09 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
2011/12/08 PHP
php array的学习笔记
2012/05/16 PHP
PHP原生函数一定好吗?
2014/12/08 PHP
php使用PDO方法详解
2014/12/27 PHP
php计划任务之ignore_user_abort函数实现方法
2015/01/08 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
jquery 之 $().hover(func1, funct2)使用方法
2012/06/14 Javascript
jquery实现excel导出的方法
2013/04/04 Javascript
JavaScript函数的4种调用方法详解
2014/04/22 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
基于bootstrap的选择框插件icheck
2016/12/23 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
es6基础学习之解构赋值
2018/12/10 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
vue中组件通信的八种方式(值得收藏!)
2019/08/09 Javascript
JS实现json数组排序操作实例分析
2019/10/28 Javascript
Vue axios 将传递的json数据转为form data的例子
2019/10/29 Javascript
Python环境变量设置方法
2016/08/28 Python
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
python实现日常记账本小程序
2018/03/10 Python
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
python爬虫实现中英翻译词典
2019/06/25 Python
Python collections.deque双边队列原理详解
2020/10/05 Python
python 对象真假值的实例(哪些视为False)
2020/12/11 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
会计主管岗位职责范文
2013/11/08 职场文书
商场客服专员岗位职责
2014/06/13 职场文书
活动总结格式
2014/08/30 职场文书
肖申克的救赎观后感
2015/06/02 职场文书
教你用eclipse连接mysql数据库
2021/04/22 MySQL
win10系统计算机图标怎么调出来?win10调出计算机图标的方法
2022/08/14 数码科技