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 逐行分割大txt文件的方法
Oct 10 Python
python list元素为tuple时的排序方法
Apr 18 Python
python爬虫_实现校园网自动重连脚本的教程
Apr 22 Python
Python类和对象的定义与实际应用案例分析
Dec 27 Python
pyqt5实现俄罗斯方块游戏
Jan 11 Python
python多线程http压力测试脚本
Jun 25 Python
python里dict变成list实例方法
Jun 26 Python
详解PyTorch中Tensor的高阶操作
Aug 18 Python
tensorflow 初始化未初始化的变量实例
Feb 06 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
Apr 14 Python
pygame用blit()实现动画效果的示例代码
May 28 Python
Python绘制地图神器folium的新人入门指南
May 23 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使用Jpgraph创建柱状图展示年度收支表效果示例
2017/02/15 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
2018/12/20 PHP
tp5.1 框架查询表达式用法详解
2020/05/25 PHP
jquery中获取id值方法小结
2013/09/22 Javascript
js图片滚动效果时间可随意设定当鼠标移上去时停止
2014/06/26 Javascript
引用其它js时如何同时处理多个window.onload事件
2014/09/02 Javascript
javascript:void(0)是什么意思及href=#与href=javascriptvoid(0)的区别
2015/11/13 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【二】
2016/05/10 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
Bootstrap表单控件学习使用
2017/03/07 Javascript
基于daterangepicker日历插件使用参数注意的问题
2017/08/10 Javascript
JavaScript 判断iPhone X Series机型的方法
2019/01/28 Javascript
微信小程序城市选择及搜索功能的方法
2019/03/22 Javascript
使用 vue 实现灭霸打响指英雄消失的效果附demo
2019/05/06 Javascript
Javascript原生ajax请求代码实例
2020/02/20 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
js实现盒子移动动画效果
2020/08/09 Javascript
vue 子组件和父组件传值的示例
2020/09/11 Javascript
vue项目中使用rem,在入口文件添加内容操作
2020/11/11 Javascript
Python @property使用方法解析
2019/09/17 Python
python队列原理及实现方法示例
2019/11/27 Python
python3实现往mysql中插入datetime类型的数据
2020/03/02 Python
python 追踪except信息方式
2020/04/25 Python
一套.net面试题及答案
2016/11/02 面试题
毕业生精彩的自我评价分享
2013/10/06 职场文书
年终自我鉴定
2013/10/09 职场文书
仓管岗位职责范本
2014/02/08 职场文书
道路交通安全实施方案
2014/03/12 职场文书
优秀团员自我评价范文
2014/04/23 职场文书
销售顾问工作计划书
2014/08/15 职场文书
留学推荐信怎么写
2015/03/26 职场文书
《金钱的魔力》教学反思
2016/02/20 职场文书
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
2021/05/25 Python
Python 如何解决稀疏矩阵运算
2021/05/26 Python
nginx结合openssl实现https的方法
2021/07/25 Servers
SQL语法CONSTRAINT约束操作详情
2022/01/18 MySQL