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 相关文章推荐
Python3搜索及替换文件中文本的方法
May 22 Python
浅谈五大Python Web框架
Mar 20 Python
详解 Python 与文件对象共事的实例
Sep 11 Python
Python实现句子翻译功能
Nov 14 Python
Python Flask框架扩展操作示例
May 03 Python
pybind11和numpy进行交互的方法
Jul 04 Python
新手入门Python编程的8个实用建议
Jul 12 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
Mar 18 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
Jan 12 Python
python 可视化库PyG2Plot的使用
Jan 21 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
May 20 Python
Python万能模板案例之matplotlib绘制甘特图
Apr 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
探讨:parse url解析URL,返回其组成部分
2013/06/14 PHP
简单的php中文转拼音的实现代码
2014/02/11 PHP
PHP制作万年历
2015/01/07 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
解决php扩展安装不生效问题
2019/10/25 PHP
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
2014/05/07 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
深入理解JavaScript系列(27):设计模式之建造者模式详解
2015/03/03 Javascript
jQuery插件bgStretcher.js实现全屏背景特效
2015/06/05 Javascript
javascript数组随机排序实例分析
2015/07/22 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
layer关闭弹出窗口触发表单提交问题的处理方法
2019/09/25 Javascript
基于JavaScript实现大文件上传后端代码实例
2020/08/18 Javascript
[01:12]DOTA2 2015年秋季互动指南
2015/11/10 DOTA
[01:15]《辉夜杯》北京网鱼队巡礼
2015/10/26 DOTA
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
使用python实现http及ftp服务进行数据传输的方法
2018/10/26 Python
Python数据类型之Dict字典实例详解
2019/05/07 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
python 已知三条边求三角形的角度案例
2020/04/12 Python
pycharm如何设置官方中文(如何汉化)
2020/12/29 Python
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
直接有效的自我评价
2014/01/11 职场文书
大学校运会广播稿
2014/02/03 职场文书
幼儿园个人总结
2015/02/28 职场文书
学生会辞职信
2015/03/02 职场文书
收入证明怎么写
2015/06/12 职场文书
中学校园广播稿
2015/08/18 职场文书
2019奶茶店创业计划书范本,值得你借鉴
2019/08/14 职场文书
python脚本框架webpy模板控制结构
2021/11/20 Python
Go语言入门exec的基本使用
2022/05/20 Golang