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 相关文章推荐
17个Python小技巧分享
Jan 23 Python
在Python中使用Mako模版库的简单教程
Apr 08 Python
使用Python设置tmpfs来加速项目的教程
Apr 17 Python
python抓取最新博客内容并生成Rss
May 17 Python
以一个投票程序的实例来讲解Python的Django框架使用
Feb 18 Python
Python定时器实例代码
Nov 01 Python
python 数字类型和字符串类型的相互转换实例
Jul 17 Python
如何将你的应用迁移到Python3的三个步骤
Dec 22 Python
Python实现鼠标自动在屏幕上随机移动功能
Mar 14 Python
终于搞懂了Keras中multiloss的对应关系介绍
Jun 22 Python
浅谈keras中的keras.utils.to_categorical用法
Jul 02 Python
django和flask哪个值得研究学习
Jul 31 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代码的53条建议
2008/03/27 PHP
用PHP获取Google AJAX Search API 数据的代码
2010/03/12 PHP
PHP格式化MYSQL返回float类型的方法
2016/03/30 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
2017/05/29 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
使弱类型的语言JavaScript变强势
2009/06/22 Javascript
利用javascript实现一些常用软件的下载导航
2009/08/03 Javascript
jquery学习笔记二 实现可编辑的表格
2010/04/09 Javascript
js鼠标左右键 键盘值小结
2010/06/11 Javascript
javascript的push使用指南
2014/12/05 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
2017/05/11 Javascript
使用 Node.js 对文本内容分词和关键词抽取
2017/05/27 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
2018/05/31 Javascript
nodejs 使用nodejs-websocket模块实现点对点实时通讯
2018/11/28 NodeJs
[49:54]Ti4 循环赛第三日 LGD vs Titan
2014/07/12 DOTA
Python实现去除代码前行号的方法
2015/03/10 Python
Python字符编码与函数的基本使用方法
2017/09/30 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
2018/02/08 Python
python爬虫之urllib3的使用示例
2018/07/09 Python
Python3.x+迅雷x 自动下载高分电影的实现方法
2020/01/12 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
python使用梯度下降算法实现一个多线性回归
2020/03/24 Python
CSS3田字格列表的样式编写方法
2018/11/22 HTML / CSS
安全生产检讨书
2014/01/21 职场文书
初二生物教学反思
2014/02/03 职场文书
信用社员工先进事迹材料
2014/02/04 职场文书
车辆工程专业求职信
2014/04/28 职场文书
工地标语大全
2014/06/18 职场文书
党的群众路线教育实践活动心得体会(企业)
2014/11/03 职场文书
2015国庆节感想
2015/08/04 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
分享几个JavaScript运算符的使用技巧
2021/04/24 Javascript
PYTHON InceptionV3模型的复现详解
2022/05/06 Python
docker 制作mysql镜像并自动安装
2022/05/20 Servers