python操作xml文件详细介绍


Posted in Python onJune 09, 2014

关于python读取xml文章很多,但大多文章都是贴一个xml文件,然后再贴个处理文件的代码。这样并不利于初学者的学习,希望这篇文章可以更通俗易懂的教如何使用python 来读取xml 文件。

一、什么是xml?

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

abc.xml

<?xml version="1.0" encoding="utf-8"?>

<catalog>

    <maxid>4</maxid>

    <login username="pytest" passwd='123456'>

        <caption>Python</caption>

        <item id="4">

            <caption>测试</caption>

        </item>

    </login>

    <item id="2">

        <caption>Zope</caption>

    </item>

</catalog>

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

那么它有如下特征:

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

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

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

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

二、获得标签属性

那么,下面来介绍如何用python来读取这种类型的文件。

#coding=utf-8

import  xml.dom.minidom
#打开xml文档

dom = xml.dom.minidom.parse('abc.xml')
#得到文档元素对象

root = dom.documentElement

print root.nodeName

print root.nodeValue

print root.nodeType

print root.ELEMENT_NODE

mxl.dom.minidom 模块被用来处理xml文件,所以要先引入。

xml.dom.minidom.parse() 用于打开一个xml文件,并将这个文件对象dom变量。

documentElement 用于得到dom对象的文档元素,并把获得的对象给root

每一个结点都有它的nodeName,nodeValue,nodeType属性。

nodeName为结点名字。

nodeValue是结点的值,只对文本结点有效。

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'

三、获得子标签

现在要获得catalog的子标签以的标签name

<?xml version="1.0" encoding="utf-8"?>

<catalog>

       <maxid>4</maxid>

       <login username="pytest" passwd='123456'>

            <caption>Python</caption>

             <item id="4">

                    <caption>测试</caption>

            </item>

    </login>

    <item id="2">

            <caption>Zope</caption>

    </item>

</catalog>

对于知道元素名字的子元素,可以使用getElementsByTagName方法获取:

#coding=utf-8

import  xml.dom.minidom
#打开xml文档

dom = xml.dom.minidom.parse('abc.xml')
#得到文档元素对象

root = dom.documentElement
bb = root.getElementsByTagName('maxid')

b= bb[0]

print b.nodeName
bb = root.getElementsByTagName('login')

b= bb[0]

print b.nodeName

如何区分相同标签名字的标签:

<?xml version="1.0" encoding="utf-8"?>

<catalog>

       <maxid>4</maxid>

       <login username="pytest" passwd='123456'>

            <caption>Python</caption>

             <item id="4">

                    <caption>测试</caption>

            </item>

    </login>

    <item id="2">

            <caption>Zope</caption>

    </item>

</catalog>

<caption>和<item>标签不止一个如何区分?

#coding=utf-8

import  xml.dom.minidom
#打开xml文档

dom = xml.dom.minidom.parse('abc.xml')
#得到文档元素对象

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

b= bb[2]

print b.nodeName
bb = root.getElementsByTagName('item')

b= bb[1]

print b.nodeName

root.getElementsByTagName('caption') 获得的是标签为caption 一组标签,b[0]表示一组标签中的第一个;b[2] ,表示这一组标签中的第三个。

四、获得标签属性值

<?xml version="1.0" encoding="utf-8"?>

<catalog>

       <maxid>4</maxid>

       <login username="pytest" passwd='123456'>

            <caption>Python</caption>

             <item id="4">

                    <caption>测试</caption>

            </item>

    </login>

    <item id="2">

            <caption>Zope</caption>

    </item>

</catalog>

<login>和<item>标签是有属性的,如何获得他们的属性?

#coding=utf-8

import  xml.dom.minidom
#打开xml文档

dom = xml.dom.minidom.parse('abc.xml')
#得到文档元素对象

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

item = itemlist[0]

un=item.getAttribute("username")

print un

pd=item.getAttribute("passwd")

print pd
ii = root.getElementsByTagName('item')

i1 = ii[0]

i=i1.getAttribute("id")

print i
i2 = ii[1]

i=i2.getAttribute("id")

print i

getAttribute方法可以获得元素的属性所对应的值。

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

<?xml version="1.0" encoding="utf-8"?>

<catalog>

       <maxid>4</maxid>

       <login username="pytest" passwd='123456'>

            <caption>Python</caption>

             <item id="4">

                    <caption>测试</caption>

            </item>

    </login>

    <item id="2">

            <caption>Zope</caption>

    </item>

</catalog>

<caption>标签对之间是有数据的,如何获得这些数据?

获得标签对之间的数据有多种方法,

方法一:

#coding=utf-8

import  xml.dom.minidom
#打开xml文档

dom = xml.dom.minidom.parse('abc.xml')
#得到文档元素对象

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

c1=cc[0]

print c1.firstChild.data
c2=cc[1]

print c2.firstChild.data
c3=cc[2]

print c3.firstChild.data

firstChild 属性返回被选节点的第一个子节点,.data表示获取该节点人数据。

方法二:

#coding=utf-8

from xml.etree import ElementTree as ET

per=ET.parse('abc.xml')

p=per.findall('./login/item')
for oneper in p:

    for child in oneper.getchildren():

        print child.tag,':',child.text


p=per.findall('./item')
for oneper in p:

    for child in oneper.getchildren():

        print child.tag,':',child.text

方法二有点复杂,所引用模块也与前面的不一样,findall用于指定在哪一级标签下开始遍历。

getchildren方法按照文档顺序返回所有子标签。并输出标签名(child.tag)和标签的数据(child.text)

其实,方法二的作用不在于此,它核心功能是可以遍历某一级标签下的所有子标签。

Python 相关文章推荐
从零学Python之入门(四)运算
May 27 Python
Python使用Flask框架获取当前查询参数的方法
Mar 21 Python
python实现定时播放mp3
Mar 29 Python
Python中正则表达式的详细教程
Apr 30 Python
使用Python实现BT种子和磁力链接的相互转换
Nov 09 Python
MySQL适配器PyMySQL详解
Sep 20 Python
对python文件读写的缓冲行为详解
Feb 13 Python
深入了解和应用Python 装饰器 @decorator
Apr 02 Python
OpenCV 表盘指针自动读数的示例代码
Apr 10 Python
python实现npy格式文件转换为txt文件操作
Jul 01 Python
Python接口自动化测试框架运行原理及流程
Nov 30 Python
python pillow库的基础使用教程
Jan 13 Python
实例讲解python函数式编程
Jun 09 #Python
理解python多线程(python多线程简明教程)
Jun 09 #Python
Python高级应用实例对比:高效计算大文件中的最长行的长度
Jun 08 #Python
Python实例分享:快速查找出被挂马的文件
Jun 08 #Python
python小技巧之批量抓取美女图片
Jun 06 #Python
Python学习笔记(二)基础语法
Jun 06 #Python
pycharm 使用心得(九)解决No Python interpreter selected的问题
Jun 06 #Python
You might like
PHP 上传文件大小限制
2009/07/05 PHP
PHP COOKIE及时生效的方法介绍
2014/02/14 PHP
PDO::exec讲解
2019/01/28 PHP
基于Laravel 5.2 regex验证的正确写法
2019/09/29 PHP
javascript 出生日期和身份证判断大全
2008/11/13 Javascript
Iframe thickbox2.0使用的方法
2009/03/05 Javascript
window.parent与window.openner区别介绍
2012/04/12 Javascript
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
2013/03/21 Javascript
JS实现当前页居中分页效果的方法
2015/06/18 Javascript
jQuery UI Bootstrap是什么?
2016/06/17 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
Node.js测试中的Mock文件系统详解
2016/11/21 Javascript
简单理解vue中实例属性vm.$els
2016/12/01 Javascript
JavaScript对象封装的简单实现方法(3种方法)
2017/01/03 Javascript
使用SVG基本操作API的实例讲解
2017/09/14 Javascript
推荐一个基于Node.js的表单验证库
2019/02/15 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
Python写的服务监控程序实例
2015/01/31 Python
详解Python3.1版本带来的核心变化
2015/04/07 Python
对python的文件内注释 help注释方法
2018/05/23 Python
Python3实现的简单三级菜单功能示例
2019/03/12 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
远程学习的教学用品和家庭学习资源:Really Good Stuff
2020/04/27 全球购物
SQL里面IN比较快还是EXISTS比较快
2012/07/19 面试题
物业管理大学生个人的自我评价
2013/10/10 职场文书
质检部部长职责
2013/12/16 职场文书
2014植树节活动总结
2014/03/11 职场文书
羊脂球读书笔记
2015/06/30 职场文书
校园安全主题班会
2015/08/12 职场文书
《我们的民族小学》教学反思
2016/02/19 职场文书
Mybatis-plus在项目中的简单应用
2021/07/01 Java/Android