python读取xml文件方法解析


Posted in Python onAugust 04, 2020

关于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>

标签可以有属性:<aaid='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方法获取:

<?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>

如何区分相同标签名字的标签:

<?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文件方法解析的文章就介绍到这了,更多相关python读取xml文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python 获取文件列表(或是目录例表)
Mar 25 Python
使用python将mdb数据库文件导入postgresql数据库示例
Feb 17 Python
Python将多个excel表格合并为一个表格
Feb 22 Python
Python实现发送与接收邮件的方法详解
Mar 28 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
Apr 17 Python
python 为什么说eval要慎用
Mar 26 Python
Python对接 xray 和微信实现自动告警
Sep 17 Python
Python数据可视化:顶级绘图库plotly详解
Dec 07 Python
将python包发布到PyPI和制作whl文件方式
Dec 25 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
May 16 Python
pandas 数据类型转换的实现
Dec 29 Python
解决import tensorflow导致jupyter内核死亡的问题
Feb 06 Python
如何利用python进行时间序列分析
Aug 04 #Python
通过实例简单了解Python sys.argv[]使用方法
Aug 04 #Python
哪种Python框架适合你?简单介绍几种主流Python框架
Aug 04 #Python
python logging 重复写日志问题解决办法详解
Aug 04 #Python
Windows下Sqlmap环境安装教程详解
Aug 04 #Python
Python中logger日志模块详解
Aug 04 #Python
Python模块zipfile原理及使用方法详解
Aug 04 #Python
You might like
php限制ip地址范围的方法
2015/03/31 PHP
推荐dojo学习笔记
2007/03/24 Javascript
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
2012/02/16 Javascript
javascrpt绑定事件之匿名函数无法解除绑定问题
2012/12/06 Javascript
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
jQuery选择器源码解读(六):Sizzle选择器匹配逻辑分析
2015/03/31 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
js实现String.Fomat的实例代码
2016/09/02 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
vue实现直播间点赞飘心效果的示例代码
2019/09/20 Javascript
原生js实现文件上传、下载、封装等实例方法
2020/01/05 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
[01:21]DOTA2周边文化主题展 神秘商店火热开售
2017/07/30 DOTA
[01:16]DOTA2小知识课堂 Ep.03 芒果树无伤肉山
2019/12/05 DOTA
python3实现短网址和数字相互转换的方法
2015/04/28 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
python实现解数独程序代码
2017/04/12 Python
python用户管理系统的实例讲解
2017/12/23 Python
Python爬虫使用脚本登录Github并查看信息
2018/07/16 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
tensor和numpy的互相转换的实现示例
2019/08/02 Python
Python高级特性 切片 迭代解析
2019/08/23 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
斯巴达比赛商店:Spartan Race
2019/01/08 全球购物
小加工厂管理制度
2014/01/21 职场文书
大学生创业感言
2014/01/25 职场文书
工会积极分子个人总结
2015/03/03 职场文书
部门经理助理岗位职责
2015/04/13 职场文书
2016继续教育培训学习心得体会
2016/01/19 职场文书
JS数组的常用方法整理
2021/03/31 Javascript
gojs实现蚂蚁线动画效果
2022/02/18 Javascript