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 09 Python
Python的消息队列包SnakeMQ使用初探
Jun 29 Python
python自动发邮件库yagmail的示例代码
Feb 23 Python
Python实现的读写json文件功能示例
Jun 05 Python
详谈Pandas中iloc和loc以及ix的区别
Jun 08 Python
50行Python代码获取高考志愿信息的实现方法
Jul 23 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
Jul 23 Python
pytorch多进程加速及代码优化方法
Aug 19 Python
python实现FTP循环上传文件
Mar 20 Python
MAC平台基于Python Appium环境搭建过程图解
Aug 13 Python
scrapy中如何设置应用cookies的方法(3种)
Sep 22 Python
Python字符串的转义字符
Apr 07 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中ini_set和ini_get函数的用法小结
2014/02/18 PHP
php中字符集转换iconv函数使用总结
2014/10/11 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
javascript中String类的subString()方法和slice()方法
2011/05/24 Javascript
鼠标选择动态改变网页背景颜色的JS代码
2013/12/10 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
2014/03/13 Javascript
jquery禁用右键单击功能屏蔽F5刷新
2014/03/17 Javascript
Bootstrap表单布局样式源代码
2016/07/04 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
angularjs实现猜数字大小功能
2020/05/20 Javascript
vue实现移动端悬浮窗效果
2018/12/01 Javascript
如何从0开始用node写一个自己的命令行程序
2018/12/29 Javascript
使用typescript构建Vue应用的实现
2019/08/26 Javascript
关于layui表单中按钮自动提交的解决方法
2019/09/09 Javascript
微信小程序实现禁止分享代码实例
2019/10/19 Javascript
Vue 中使用 typescript的方法详解
2020/02/17 Javascript
JS原型prototype和__proto__用法实例分析
2020/03/14 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
vue添加自定义右键菜单的完整实例
2020/12/08 Vue.js
[28:07]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第二场 12.13
2020/12/17 DOTA
在Python的Flask框架中实现单元测试的教程
2015/04/20 Python
简单理解Python中的装饰器
2015/07/31 Python
Python 基于Twisted框架的文件夹网络传输源码
2016/08/28 Python
Python实现序列化及csv文件读取
2020/01/19 Python
CSS3制作日历实现代码
2012/01/21 HTML / CSS
关于老式浏览器兼容HTML5和CSS3的问题
2016/06/01 HTML / CSS
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
2018/01/10 HTML / CSS
外企财务年会演讲稿
2014/01/03 职场文书
促销活动计划书
2014/05/02 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
2015学校师德师风工作总结
2015/04/22 职场文书
实习单位意见
2015/06/04 职场文书
2016高校自主招生自荐信范文
2016/01/28 职场文书
Python 如何将integer转化为罗马数(3999以内)
2021/06/05 Python
Mysql Innodb存储引擎之索引与算法
2022/02/15 MySQL
从结婚开始的恋爱故事。小说《我的美好婚事》TV动画化决定
2022/04/07 日漫