当前位置: 首页 > 编程日记 > 正文

python之XML文件解析

python对XML的解析

常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同。

python有三种方法解析XML,分别是SAX,DOM,以及ElementTree三种方法。

以下案例依次介绍三种方法:

先写一个关于book的xml文件

<books><book id="01"><bookname>python入门</bookname><author>李强</author><price>25</price></book><book id="02"><bookname>java基础</bookname><author>王洋</author><price>30</price></book><book id="03"><bookname>神雕侠侣</bookname><author>金庸</author><price>212</price></book></books>

1.DOM(Document Object Model)

将XML数据在内存中解析成一个树,通过对树的操作来操作XML。

操作代码如下:

#引入parse的包
from xml.dom.minidom import parsedoc=parse("book.xml")                   #先把xml文件加载进来
root=doc.documentElement                #获取元素的根节点
books=root.getElementsByTagName('book') #找到子节点,得到的是一个数组for book in books:                       #把所有的子节点进行遍历print("===book====")if book.hasAttribute('id'):             #如果有ID属性,则输出print('书的ID是:%s'% book.getAttribute('id'))bookname=book.getElementsByTagName("bookname")[0]  #根据标签名找到,并且输出第一个元素print("书名是:%s"%bookname.childNodes[0].data)      #输出标签名的子节点的第一个值,并转为data类型author=book.getElementsByTagName("author")[0]print("作者是:%s"%author.childNodes[0].data)price=book.getElementsByTagName("price")[0]print("价格是:%s"%price.childNodes[0].data)

2.SAX (simple API for XML )

python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。

from xml.sax import parse, ContentHandler #引入继承包ContentHandler#书的类
class Book:#定义初始化属性,和xml文件属性相同def __init__(self,bookname=None,author=None,price=None):self.bookname=booknameself.author=authorself.price=pricedef __str__(self):  #转化为字符串输出return self.bookname+","+self.author+","+self.pricebooks=[]#定义一个书的数组,用来存放每次得到的数据#定义继承ContentHandler的类,可以实现相应的方法
class bkdemo(ContentHandler):def __init__(self):#定义全局变量self.book=None #用来接收book的相应数据self.tag=None  #用来接收characters方法得到的content内容def startDocument(self): #books对象开始print("对象开始")def endDocument(self):  #books对象结束print("对象结束")def startElement(self, name, attrs): #每一个标签元素的开始,name:标签名称 attrs:标签内部相应属性if name=='book':  #如果标签名是bookself.book=Book()  #创建一个Book()对象def endElement(self, name):  #每一个标签元素的结束,name:标签名称 (此时才会得到相应的content)if name=='bookname':self.book.bookname=self.tag  #对象的标签名=得到相应content的值if name=='author':self.book.author=self.tagif name=='price':self.book.price=self.tagif name=='book':books.append(self.book)  #为定义的数组追加得到的相应元素def characters(self, content):self.tag=content   #写了self的,就可以定义为全局变量
parse("book.xml",bkdemo())  #parse的方法,分别指明xml文件,并调用查找的类方法
for i in books:   #对数组books[]循环print(i)

3.ElementTree(元素树)

ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。

from xml.etree import ElementTree  #引入ElementTree的包
#书的类
class Book:#定义初始化属性,和xml文件属性相同def __init__(self,bookname=None,author=None,price=None):self.bookname=booknameself.author=authorself.price=pricedef __str__(self):  #转化为字符串输出return self.bookname+","+self.author+","+self.priceroota=ElementTree.parse("book.xml") #parse方法读取xml文件,得到元素树
bk=roota.findall("book")  #findall查询所有的book标签
boo=[]   #定义一个集合
for aa in bk:   #对得到的所有的根元素下的子标签循环输出book=Book()   #定义一个类对象book.bookname=aa.find("bookname").text #对象的相应标签值=子标签查找到的固定标签名,并以text形式输出book.author=aa.find("author").textbook.price=aa.find("price").textboo.append(book)  #将得到的属性值追加到定义的集合中for i in boo:  #遍历集合print(i)

输出结果:

python入门,李强,25
java基础,王洋,30
神雕侠侣,金庸,212Process finished with exit code 0

注:因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)。

本章节使用到的 XML 实例文件 movies.xml 内容如下:

转载于:https://www.cnblogs.com/qianshuixianyu/p/9184213.html

相关文章:

这句话真他妈经典

研究解决一个问题的时候&#xff0c;通常花百分之二十的时间和精力&#xff0c;就能抓住问题的百分之八十&#xff0c;而为了完善那余下的百分之二十&#xff0c;却往往要花百分之八十的时间和精力 这句话真他妈经典&#xff0c;呵呵 转载于:https://www.cnblogs.com/webcool…

hung-yi lee_p4_Bias And Variance

文章目录本节目的biasvariance结论&#xff08;鱼和熊掌不可得兼&#xff09;如何解决减小bias的方案减小variance的方案对训练集进行处理得到更好的模型本节目的 where does the error come from?&#xff08;为什么最复杂的模型反而Loss函数的值越大&#xff09; error有…

感觉 Data Access Application Block(DAAB) 里也有可能写得不太好的地方

昨天下载了博客园的代码&#xff0c;里面有一个Data\SqlServer.cs我不清楚是不是 MS DAAB 里的原样文件。不过前面有声明如下&#xff1a;////Microsoft Data Access Application Block for .NET 3.0////SqlServer.cs////This file contains the implementations of the AdoHel…

微软压力测试工具 web application stress

WEB服务器的压力测试工具~ 115808 2009年8月1日lbimba 铜牌会员 这里给广大的煤油推荐一个web网站压力测试工具。它可以用来模拟多个用户操作网站&#xff0c;在程序投入运行时&#xff0c;可以用它来进行程序的测试并得到Web站点的稳定 参数&#xff0c;甚至于可以对一台小型的…

Didn't find class net.oschina.app.AppContext on

原因 你引入的Lib 未打钩 然后在 菜单Project -> Properties -> Java Build Path -> Order & Export, 然后选中你未打钩的, 然后菜单 Project->Clean&#xff0c;然后运行程序即可。转载于:https://blog.51cto.com/12237592/2129523

hung-yi lee_p5-7_Gradient Descent(梯度下降)

原视频地址 https://www.bilibili.com/video/BV1JE411g7XF?p5 文章目录梯度下降是如何优化函数的tips1. 使用Adagrad2. Stochastic Gradient Descent3. Feature Scaling梯度下降理论基础梯度下降的局限性梯度下降是如何优化函数的 前情回顾&#xff1a;损失函数是用来衡量找到…

第九章 9.2 数组的方法(Array Methods)

注&#xff1a;这里只讲解一些 Array() 的最重要的方法。其他更多的参考手册。9.2.1 join() 将所有元素转换为字符串并默认用 "," 连接。可以指定一个附加的参数来自定义分隔符&#xff1a; vara [1, 2, 3];vars a.join(); //s "1,2,3"s a.join(", &…

HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap

http://www.importnew.com/8658.html转载于:https://www.cnblogs.com/passer1991/p/3520563.html

php7+的php-fpm参数配置,注意事项

安装php7的&#xff0c;如果php-fpm的这几个参数设置不当了&#xff0c;会导致php-fpm启动不了&#xff0c;nginx站点不能解析php文件&#xff0c;报404错误。 相关命令&#xff1a;centos7&#xff0c;启动php-fpm&#xff1a; systemctl start php-fpm查看php-fpm是否启动&am…

hung-yi lee_p10_分类/概率生成模型

文章目录研究背景本节目的本节要使用的例子研究过程把分类当成回归来算理想做法找到最佳函数的方法研究成果运用运用过程结果方法改进模型总结讨论为什么选择正态分布模型&#xff1f;关于后验概率的求法之化简与改进猜想一张图总结研究背景 本节目的 Classification:Probabi…

【跃迁之路】【495天】程序员高效学习方法论探索系列(实验阶段252-2018.06.15)...

(跃迁之路)专栏 实验说明 从2017.10.6起&#xff0c;开启这个系列&#xff0c;目标只有一个&#xff1a;探索新的学习方法&#xff0c;实现跃迁式成长实验期2年&#xff08;2017.10.06 - 2019.10.06&#xff09;我将以自己为实验对象。我将开源我的学习方法&#xff0c;方法不断…

wpf+xml实现的一个随机生成早晚餐的小demo

话说每到吃完的时间就发愁&#xff0c;真的不知道该吃什么&#xff0c;然后就想到做一个生成吃什么的小软件&#xff0c;既然这个软件如此的简单&#xff0c;就打算用wpf开发吧&#xff0c;也不用数据库了&#xff0c;直接保存在xml中就可以了 程序整体结构如下图 首先我写了一…

CentOS报错:TNS-12541: TNS:no listener TNS-12560: TNS:protocol adapter error TNS-00511: No listener

问题描述 原因 listener.ora中的ORACLE_HOME错了 解决 这个错误当时是和另一条指令lsnrctl start的错误一起报的&#xff0c;那个已解决&#xff0c;详细做法请各位移步我的另一篇博客 https://blog.csdn.net/weixin_44997802/article/details/109266708

c#数据结构———二叉查找树

using System;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />namespace BinaryTreeLibrary{///创建的是二叉查找树&#xff0c;没有重复的结点值///特点&#xff1a;左支树中任何值都小于父结点值&#xff0c;右结点任何值大于…

Spring事务管理只对出现运行期异常进行回滚

使用spring难免要用到spring的事务管理&#xff0c;要用事务管理又会很自然的选择声明式的事务管理&#xff0c;在spring的文档中说道&#xff0c;spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚&#xff0c;而对检查型异常则不进行回滚操作。那么什么是检查…

struts学习笔记三-国际化

在程序设计领域&#xff0c;人们把能够在无需改写有关代码的前提下&#xff0c;让开发出来的应用程序能够支持多种语言和数据格式的技术称为国际化技术。 国际化简称为 i18n&#xff0c;根据internationalization简化而来。 本地化简称为l10n&#xff0c;根据localization简化而…

TNS-01201: Listener cannot find executable /u01/oracle/bin/extproc for SID orcl Listener failed to

文章目录问题描述原因解决过程结果问题描述 原因 listener.ora文件中ORACLE_HOME的路径错了&#xff0c;导致按照这个路径找不到extproc 解决过程 首先去找ORACLE_HOME的路径 先切换为root用户&#xff08;这样查找时不会有文件夹进不去&#xff09; 输入指令 su root然后…

与技术无关的书单--你可以笑着说有些是“精神鸦片”

??? 转载于:https://www.cnblogs.com/crmhf/p/3823130.html

隐马尔科夫模型HMM(一)HMM模型

2019独角兽企业重金招聘Python工程师标准>>> 隐马尔科夫模型&#xff08;Hidden Markov Model&#xff0c;以下简称HMM&#xff09;是比较经典的机器学习模型了&#xff0c;它在语言识别&#xff0c;自然语言处理&#xff0c;模式识别等领域得到广泛的应用。当然&am…

stella forum v 2.0 的两款主题样式

stella forum v 2.0 的开发工作已经快结束啦&#xff0c;现在我正在加紧努力&#xff0c;想在本周内完成&#xff0c;因为下个星期我可能会不在学校。 下面公开一下我在做的两款主题&#xff0c;第一个是以前v1 版用的经典论坛的样式&#xff0c;而下面的第二款来自一个我很喜欢…

startup mount报错:invalid value given for the diagnostic_dest init.ora parameter

问题描述 解决思路 找到错误控制信息输出路径下的init文件 &#xff08;我的不知道为什么叫做initORCL.ora&#xff09; 将其中的ORACLE_BASE修改为正确路径 解决过程 输入指令 vi /db/app/oracle/product/11.2.0/dbs/initORCL.ora将其中三个涉及到ORACLE_BASE的地方该为正…

java的常用包

java.applet&#xff1a; 包含一些用于创建Java小应用程序的类。运行于html页面中。java.awt &#xff1a;包含一些用于编写与平台无关的图形界面&#xff08;GUI&#xff09;应用程序的类。java.io&#xff1a;包含一些用作输入输出&#xff08;I/O&#xff09;处理的类。java…

jQuery中的 $.ajax的一些方法

1. $(document).ajaxConplete(function(){}) 1.8版本之后&#xff0c;只能绑定到document元素上&#xff1b;1.8版本之前&#xff0c;可以帮到其他元素上 当$.ajax执行完成之后&#xff0c;执行该函数。如果有多个$.ajax请求&#xff0c;就会执行多次&#xff1b;如果有两个或多…

freebsd command

ps -aux netstat -m netstat 1 top pkg_info systat -vm systat -if dmesg netstat -an unix/linux指令集 (简体) (原作者: 农夫) http://www.darkcc.org/fmandarkcc/index.php 转载于:https://www.cnblogs.com/funpower/archive/2005/07/09/189198.html

hung-yi lee_p11_逻辑回归

文章目录step1 Function Setstep2 goodness of a functionstep3 Find the best functionwhy not Logistic Regression Square ErrorDiscriminative v.s. Generative结论&#xff08;判别模型的优势&#xff09;解释-生成模型为何稍逊色生成模型的优势多分类模型逻辑回归的局限…

自定义状态切换按钮

最近在做一个项目&#xff0c;一个界面的按钮UI给画成了这样&#xff08;默认状态是蓝色的然后触摸后变成灰色的&#xff09; UI效果然后本着给低版本系统APP适配的职业素养&#xff08;其实是不想画这种按钮&#xff09;&#xff0c;想让UI兄弟给将图标改成整个按钮效果的图片…

操作SQLite数据库

本文摘自&#xff1a; http://docs.blackberry.com/en/developers/deliverables/25108/Creating_and_deleting_SQLite_databases_1219776_11.jsp 创建和删除 SQLite 数据库 您可以创建临时或永久数据库。 CREATE TABLE 语句可用于创建永久&#xff08;或常规&#xff09;数据库…

刚开始Windows Mobile的开发,请大家多多关照

刚开始学习Windows Mobile的开发&#xff0c;现在正在学习WML和WAP的网站制作&#xff0c;请大家多多关照。转载于:https://www.cnblogs.com/czha2002/archive/2005/07/12/191129.html

STARTUP报错:ORA-00205: error in identifying control file, check alert log for more info

问题描述 startup nomount没有异常 startup mount则出现异常&#xff0c;说明控制文件出错

Java基础知识回顾之六 ----- IO流

前言 在上一篇文章中&#xff0c;回顾了Java的多线程。而在本篇文章中主要介绍Java IO的相关知识。 IO的介绍 什么是IO&#xff1f; IO的名称又来是Input与Output的缩写&#xff0c;也就是输入流和输出流。输入流用于从源读取数据&#xff0c;输出流用于向目标写数据。 可以从下…