python专题-读取xml文件
关于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>
标签可以嵌入子标签(具有层级关系):
<aa>
<bb></bb>
</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'
NodeTypes - 有名常数
http://www.w3school.com.cn/xmldom/dom_nodetype.asp
获得子标签
现在要获得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专题-读取xml文件的更多相关文章
- 【304】python专题-读取xml文件
参考:XML DOM 参考手册(w3school) 参考:python专题-读取xml文件 参考:请问用python怎么修改xml的节点值? 1. 读取标签内的文本(Python) 如下的 xml 文 ...
- python读取xml文件
关于python读取xml文章很多,但大多文章都是贴一个xml文件,然后再贴个处理文件的代码.这样并不利于初学者的学习,希望这篇文章可以更通俗易懂的教如何使用python 来读取xml 文件. 什么是 ...
- 【Python实例一】使用minidom读取xml文件
前言:最近刚在廖雪峰老师的网站里学习了Python的基础内容,想着循序渐进地找点实例练练手,网上看到有很多相关资料,决定针对感兴趣的内容实际编码实践一下,昨天刚好看到有关使用Python来读取XML文 ...
- selenium-python读取XML文件
首先这是我们要读取的XML文件 <?xml version="1.0" encoding="utf-8" ?><info> <ba ...
- 读取xml文件,写入excel
在上一篇 Python写xml文件已经将所有订单写入xml文件,这一篇我们把xml文件中的内容读出来,写入excel文件. 输入xml格式: <?xml version="1.0&qu ...
- C#中常用的几种读取XML文件的方法
1.C#中常用的几种读取XML文件的方法:http://blog.csdn.net/tiemufeng1122/article/details/6723764/
- 读取xml文件报错:Invalid byte 2 of 2-byte UTF-8 sequence。
程序读取xml文件后,系统报“Invalid byte 2 of 2-byte UTF-8 sequence”错误,如何解决呢? 1.程序解析xml的时候,出现Invalid byte 2 of 2- ...
- C#读取XML文件的基类实现
刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node ...
- C#读取XML文件的方法
先写一个xml文件: <?xml version="1.0" encoding="utf-8" ?> <bookste> <!-- ...
随机推荐
- ARKit 初体验
ARKIT是苹果公司在今年发布的一个AR开发包,用于现有的IOS设备,是的,就是用在手机或者平板上,类似于pokemon go的效果.看了下演示视屏,嗯,看起来很厉害. 对于一个资深软粉,居然被要求研 ...
- linux下使用scp远程传输自动输入密码
由于需要将A服务器的文件 远程传输到B服务器 但是scp命令每次都要手动输入密码 这样脚本执行太繁琐,所以讲A服务器和B服务器互信即可,具体操作如下: 首先在A服务器配置: mkdir -p ~/.s ...
- strtok函数 分类: c++ 2014-11-02 15:24 214人阅读 评论(0) 收藏
strtok函数是cstring文件中的函数 strtok函数是cstring文件中的函数 其功能是截断字符串 原型为:char *strtok(char s[],const char *delin) ...
- listView属性随笔--不断增加中。
对于一个控件的认识总是会随着时间的推移,而变的逐渐深刻. 简单的就 android:layout_height:属性来说给的数值不同就会有不同的效果,有些时候你根本想不到是跟这个属性的设置有关. 有时 ...
- 亚马逊AWS EC2云实例AMI安装LNMP环境(1)——Nginx安装
概括:这里选择亚马逊EC2的Linux AMI实例,该Linux服务器是亚马逊预配置的Linux环境,内置多个YUM源,属于亚马逊首推的稳定Linux服务器.默认登录用户名为ec2-user,执行ro ...
- 阿里消息队列中间件 RocketMQ源码解析:Message发送&接收
- zabbix前台jsrpc注入
zabbix是一个开源的企业级性能监控解决方案. 官方网站:http://www.zabbix.com zabbix的jsrpc的profileIdx2参数存在insert方式的SQL注入漏洞,攻击者 ...
- C互质个数
C互质个数 Time Limit:1000MS Memory Limit:65536K Total Submit:55 Accepted:27 Description 贝贝.妞妞和康康都长大了,如今 ...
- MySQL之增_insert-replace
MySQL增删改查之增insert.replace 一.INSERT语句 带有values子句的insert语句,用于数据的增加 语法: INSERT [INTO] tbl_name[(col_nam ...
- ChromeDriver,IEDriver,Firefox配置
ChromeDriver: 下载ChromeDriver.exe,放入某个文件夹,如C:\Program Files (x86)\Google\Chrome\Application,把此路径加入pat ...