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数据操作方法封装类实例
Jun 23 Python
python利用dir函数查看类中所有成员函数示例代码
Sep 08 Python
Python连接phoenix的方法示例
Sep 29 Python
浅谈python numpy中nonzero()的用法
Apr 02 Python
python中pip的安装与使用教程
Aug 10 Python
浅谈python下tiff图像的读取和保存方法
Dec 04 Python
python中pip的使用和修改下载源的方法
Jul 08 Python
python基于Selenium的web自动化框架
Jul 14 Python
python线程安全及多进程多线程实现方法详解
Sep 27 Python
如何从csv文件构建Tensorflow的数据集
Sep 21 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
Sep 23 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
Nov 18 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时的知识积累总结
2013/06/07 PHP
php设计模式之简单工厂模式详解
2014/09/04 PHP
PHP中Notice错误常见解决方法
2017/04/28 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
Asp.net下使用Jquery Ajax传送和接收DataTable的代码
2010/09/12 Javascript
javascript中使用replaceAll()函数实现字符替换的方法
2010/12/25 Javascript
深入理解JSON数据源格式
2014/01/10 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
IScroll5 中文API参数说明和调用方法
2016/05/21 Javascript
微信小程序小组件 基于Canvas实现直播点赞气泡效果
2020/05/29 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
js 奇葩技巧之隐藏代码
2017/08/11 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
Win10下Python环境搭建与配置教程
2016/11/18 Python
微信跳一跳python代码实现
2018/01/05 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
PyQt5实现简易计算器
2020/05/30 Python
python numpy 反转 reverse示例
2019/12/04 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
vue实现倒计时功能
2021/03/24 Vue.js
运动会广播稿300字
2014/01/10 职场文书
小学国庆节活动方案
2014/02/11 职场文书
个人违纪检讨书
2014/09/15 职场文书
离婚财产分隔协议书
2014/10/23 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
长江三峡导游词
2015/01/31 职场文书
2015中秋节晚会主持词
2015/07/01 职场文书
培训简讯范文
2015/07/20 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python