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实现股市信息下载的方法
Jun 15 Python
python 编程之twisted详解及简单实例
Jan 28 Python
分享一下如何编写高效且优雅的 Python 代码
Sep 07 Python
python中模块的__all__属性详解
Oct 26 Python
python实现机器人行走效果
Jan 29 Python
python向已存在的excel中新增表,不覆盖原数据的实例
May 02 Python
Python地图绘制实操详解
Mar 04 Python
基于python调用psutil模块过程解析
Dec 20 Python
python 读取更新中的log 或其它文本方式
Dec 24 Python
Selenium 配置启动项参数的方法
Dec 04 Python
python3实现无权最短路径的方法
May 12 Python
python中sqllite插入numpy数组到数据库的实现方法
Jun 21 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 中的str_replace 函数总结
2007/04/27 PHP
PHP简单系统数据添加以及数据删除模块源文件下载
2008/06/07 PHP
实测在class的function中include的文件中非php的global全局环境
2013/07/15 PHP
php获取百度收录、百度热词及百度快照的方法
2015/04/02 PHP
php验证手机号码
2015/11/11 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
2017/05/30 PHP
不用ajax实现点击文字即可编辑的方法
2007/12/16 Javascript
jQuery 选择器理解
2010/03/16 Javascript
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
JS弹出层的显示与隐藏示例代码
2013/12/27 Javascript
JS+JSP checkBox 全选具体实现
2014/01/02 Javascript
javascript模拟post提交隐藏地址栏的参数
2014/09/03 Javascript
Bootstrap实现水平排列的表单
2016/07/04 Javascript
js中作用域的实例解析
2017/03/16 Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
2019/04/15 Javascript
Vue快速实现通用表单验证的方法
2020/02/24 Javascript
关于vue属性使用和不使用冒号的区别说明
2020/10/22 Javascript
vue 在服务器端直接修改请求的接口地址
2020/12/19 Vue.js
java直接调用python脚本的例子
2014/02/16 Python
python计算圆周率pi的方法
2015/07/11 Python
python实现图片文件批量重命名
2020/03/23 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
2019/05/10 Python
python 爬取古诗文存入mysql数据库的方法
2020/01/08 Python
python实现引用其他路径包里面的模块
2020/03/09 Python
prAna官网:瑜伽、旅行和冒险服装
2019/03/10 全球购物
医学院四年学习生活的自我评价
2013/11/06 职场文书
法律专业实习鉴定
2013/12/22 职场文书
外企财务年会演讲稿
2014/01/03 职场文书
干部四风问题整改措施思想汇报
2014/10/13 职场文书
创业计划书详解
2019/07/19 职场文书
Nginx 过滤静态资源文件的访问日志的实现
2021/03/31 Servers
python用字节处理文件实例讲解
2021/04/13 Python
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers