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(增删改查),那么首先通过一个查询 ...
随机推荐
- SPOJ IITWPC4F - Gopu and the Grid Problem (双线段树区间修改 区间查询)
Gopu and the Grid Problem Gopu is interested in the integer co-ordinates of the X-Y plane (0<=x,y ...
- pthread条件变量
pthread条件变量等待条件有两种方式:无条件等待pthread_cond_wait()和计时等待pthread_cond_timedwait(),其中计时等待方式如果在给定时刻前条件没有满足,则返 ...
- [BZOJ 2743] 采花
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2743 Algorithm: 此题询问区间内出现次数超过1个的数字 明显在线做无从下手,无 ...
- 【并查集】【set】AtCoder - 2159 - 連結 / Connectivity
Problem Statement There are N cities. There are also K roads and L railways, extending between the c ...
- 【分块】bzoj2453 维护队列
http://www.cnblogs.com/autsky-jadek/p/4020296.html 同bzoj2120. #include<cstdio> #include<cma ...
- Linux下提示命令找不到:bash:command not found
Linux下输入某些命令时会提示:bash:command not found. 首先,查看$PATH中是否包含了这些命令. $PATH:决定了shell到哪些目录中去寻找命令或程序,PATH值是一系 ...
- Java高级架构师(一)第16节:Mybatis动态查询和Json自动拼装
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...
- scope的范围
(一)scope=“singleton” 知识点:无论获取多少个bean,得到的总是一样的地址,singleton范围下只会创建一个bean实例 1.Bean4.java package com.in ...
- nginx 隐藏index.php 并开启rewrite日志调试(apache也有)
开启rewrite 日志 error_log /data/log/nginx/error.log notice; 位于最外层,大约在文件的前几行 再在http{}括号里增加一行:rewri ...
- 【JVM】调优笔记1-----堆栈概念的对碰
关于JVM的工作原理以及调优是一个向往已久的模块,终于有幸接触到:http://pengjiaheng.iteye.com/blog/518623 那就顺着这个思路,来梳理一下自己看到后的结论和感想. ...