python操作xml文件
一、什么是xml?
xml即可扩展标记语言,它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
abc.xml
<?xml version="1.0" encoding="utf-8"?>
<catalog>
<maxid>4</maxid>
<login username="pytest" passwd=''>
<caption>Python</caption>
<item id="">
<caption>测试</caption>
</item>
</login>
<item id="">
<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=''>
<caption>Python</caption>
<item id="">
<caption>测试</caption>
</item>
</login>
<item id="">
<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=''>
<caption>Python</caption>
<item id="">
<caption>测试</caption>
</item>
</login>
<item id="">
<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=''>
<caption>Python</caption>
<item id="">
<caption>测试</caption>
</item>
</login>
<item id="">
<caption>Zope</caption>
</item>
</catalog>
<caption>标签对之间是有数据的,如何获得这些数据?
获得标签对之间的数据有多种方法,
方法一:
#coding: utf-8
import sys
import xml.dom.minidom
f=open('a.txt','w')
old=sys.stdout #将当前系统输出储存到一个临时变量中
sys.stdout=f #输出重定向到文件
dom = xml.dom.minidom.parse("2.xml")
root = dom.documentElement
itemlist = root.getElementsByTagName('caption')
print itemlist
item2 = itemlist[1]
print item2.firstChild.data.encode("utf-8")
print item2.firstChild.nodeValue.encode("utf-8")
print itemlist[1].childNodes[0].nodeValue.encode("gbk")
print itemlist[1].childNodes[0].nodeValue.encode("gbk") ---输出中文
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操作xml文件的更多相关文章
- 三十二、python操作XML文件
'''XML:模块 xml总结 1.解析 str 文件 tree,ElementTree,type root,Element,type2.操作 Element: tag,text,find,iter, ...
- 如何用python操作XML文件
备注: 基于python3 背景:在统计覆盖率的时候希望绕属性name为test的节点 具体实现源码如下所示,基本都是基于节点属性操作的,当然也就可以基于tag等其他标签去做,可根据需要调整 from ...
- 使用python操作XML增删改查
使用python操作XML增删改查 什么是XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输 ...
- Asp.Net 操作XML文件的增删改查 利用GridView
不废话,直接上如何利用Asp.NET操作XML文件,并对其属性进行修改,刚开始的时候,是打算使用JS来控制生成XML文件的,但是最后却是无法创建文件,读取文件则没有使用了 index.aspx 文件 ...
- Java操作XML文件 dom4j 篇
在项目中,我们很多都用到了xml文件,无论是参数配置还是与其它系统的数据交互.今天就来讲一下Java 中使用dom4j来操作XML文件. 我们需要引入的包: //文件包 import java.io. ...
- PHP操作XML文件学习笔记
原文:PHP操作XML文件学习笔记 XML文件属于标签语言,可以通过自定义标签存储数据,其主要作用也是作为存储数据. 对于XML的操作包括遍历,生成,修改,删除等其他类似的操作.PHP对于XML的操作 ...
- Python操作Zip文件
Python操作Zip文件 需要使用到zipfile模块 读取Zip文件 随便一个zip文件,我这里用了bb.zip,就是一个文件夹bb,里面有个文件aa.txt. import zipfile # ...
- Qt之QDomDocument操作xml文件-模拟ini文件存储
一.背景 不得不说Qt是一个很强大的类库,不管是做项目还是做产品,Qt自身封装的东西就已经非常全面了,我们今天的这篇文章就是模拟了Qt读写ini文件的一个操作,当然是由于一些外力原因,我们决定自己来完 ...
- JAVA中通过Jaxp操作XML文件基础
Java中有多种方式操作XML文件,目前讲一讲以SUN公司提供的DocumentBuilderFactory工厂类对象操作XML. 使用XML基本操作就是需要CRUD(增删改查),那么首先通过一个查询 ...
随机推荐
- 30、Django实战第30天:修改邮箱和用户信息
修改个人邮箱需要完成两个接口,一个是获取验证码,一个是新的邮箱和验证码是否匹配 1.编辑users.views.py class SendEmailCodeView(LoginRequiredMixi ...
- 14、Django实战第14天:列表筛选功能
今天完成的是点击这些条件进行机构的筛选 首先来完成城市:当用户点击城市的时候,我们自动给它加一个参数(city.id) 编辑organization.views.py 刷新页面,发现筛选功能已经OK了 ...
- Android开机过程
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha Android开机过程 BootLoder引导,然后加载Linux内核. 0号进程ini ...
- 【莫队算法】【权值分块】bzoj3809 Gty的二逼妹子序列
如题. #include<cstdio> #include<algorithm> #include<cmath> using namespace std; int ...
- Delphi 设置时间格式
// 设置WINDOWS系统的短日期的格式SetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SSHORTDATE, 'yyyy-MM-dd'); Applicat ...
- Swift,数组
1.创建(Array)数组(数组内的类型一定要相同,有序的可重复) (1)创建默认值的数组 let array:[Int] array=[Int](repeatElement(3,count:5)) ...
- javascript正则表达式(regular expression)
一种字符串匹配的模式,用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子串等.注意:在javascript中正则表达式也是一种对象1:创建正则表达式两种方式:隐式创建( ...
- Coherence的NameService
Coherence*Extend模式下客户端需要连接一个或多个proxy Server从而接入集群,在一些比较大型的环境中,Proxy Server往往比较多,一旦修改起来需要修改每个配置文件,在Co ...
- Less 简介
什么是LESSCSS LESSCSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法,为CSS的赋予了动态语言的特性,如变量.继承.运算.函数等,更方便CSS的编写和维护. LE ...
- 面试题:判断两个字符串是否互为回环变位(Circular Rotaion)
题干: 如果字符串 s 中的字符循环移动任意位置之后能够得到另一个字符串 t,那么 s 就被称为 t 的回环变位(circular rotation). 例如,ACTGACG 就是 TGACG ...