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操作MongoDB详解及实例
May 18 Python
Python tkinter事件高级用法实例
Jan 31 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
Dec 10 Python
python 读取Linux服务器上的文件方法
Dec 27 Python
详解Python3除法之真除法、截断除法和下取整对比
May 23 Python
python tkinter实现界面切换的示例代码
Jun 14 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
Jul 15 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
Aug 06 Python
学习Django知识点分享
Sep 11 Python
Windows下实现将Pascal VOC转化为TFRecords
Feb 17 Python
python 写函数在一定条件下需要调用自身时的写法说明
Jun 01 Python
python编写softmax函数、交叉熵函数实例
Jun 11 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环境搭建最新方法
2006/09/05 PHP
php全局变量和类配合使用深刻理解
2013/06/05 PHP
php 使用file_get_contents读取大文件的方法
2014/11/13 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
JavaScript几种形式的树结构菜单
2010/05/10 Javascript
js为空或不是对象问题的快速解决方法
2013/12/11 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
用jquery快速解决IE输入框不能输入的问题
2016/10/04 Javascript
详解如何在Vue2中实现组件props双向绑定
2017/03/29 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
2018/01/18 Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
2018/09/08 Javascript
Nginx设置为Node.js的前端服务器方法总结
2019/03/27 Javascript
react 组件传值的三种方法
2019/06/03 Javascript
基于mpvue的简单弹窗组件mptoast使用详解
2019/08/02 Javascript
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
js实现微信聊天效果
2020/08/09 Javascript
讲解Python中的标识运算符
2015/05/14 Python
Python base64编码解码实例
2015/06/21 Python
python制作一个桌面便签软件
2015/08/09 Python
Python 字典与字符串的互转实例
2017/01/13 Python
关于Django外键赋值问题详解
2017/08/13 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
pytorch torchvision.ImageFolder的用法介绍
2020/02/20 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
2020/07/09 Python
解决python3中os.popen()出错的问题
2020/11/19 Python
廉价连衣裙和婚纱礼服在线销售:Tbdress
2019/02/28 全球购物
拉夫劳伦爱尔兰官方网站:Ralph Lauren爱尔兰
2020/04/10 全球购物
家长寄语大全
2014/04/02 职场文书
村抢险救灾方案
2014/05/09 职场文书
给校长的建议书400字
2014/05/15 职场文书
小区文明倡议书
2014/05/16 职场文书
实习指导教师评语
2014/12/30 职场文书
乡镇司法所2015年度工作总结
2015/10/14 职场文书
Python机器学习之逻辑回归
2021/05/11 Python
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL
利用Python实现Picgo图床工具
2021/11/23 Python