首页 后端开发 Python教程 用Python解析XML的几种常见方法的介绍

用Python解析XML的几种常见方法的介绍

Jun 10, 2016 pm 03:15 PM
python xml

一、简介

       XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用。它是web发展到一定阶段的必然产物,既具有SGML的核心特征,又有着HTML的简单特性,还具有明确和结构良好等许多新的特性。
        python解析XML常见的有三种方法:一是xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合,注意xml.dom包里面有许多模块,须区分它们间的不同;二是xml.sax.*模块,它是SAX API的实现,这个模块牺牲了便捷性来换取速度和内存占用,SAX是一个基于事件的API,这就意味着它可以“在空中”处理庞大数量的的文档,不用完全加载进内存;三是xml.etree.ElementTree模块(简称 ET),它提供了轻量级的Python式的API,相对于DOM来说ET 快了很多,而且有很多令人愉悦的API可以使用,相对于SAX来说ET的ET.iterparse也提供了 “在空中” 的处理方式,没有必要加载整个文档到内存,ET的性能的平均值和SAX差不多,但是API的效率更高一点而且使用起来很方便。
二、详解

      解析的xml文件(country.xml):
在CODE上查看代码片派生到我的代码片

  <&#63;xml version="1.0"&#63;> 
  <data> 
    <country name="Singapore"> 
      <rank>4</rank> 
      <year>2011</year> 
      <gdppc>59900</gdppc> 
      <neighbor name="Malaysia" direction="N"/> 
    </country> 
    <country name="Panama"> 
      <rank>68</rank> 
      <year>2011</year> 
      <gdppc>13600</gdppc> 
      <neighbor name="Costa Rica" direction="W"/> 
      <neighbor name="Colombia" direction="E"/> 
    </country> 
  </data> 

登录后复制

1、xml.etree.ElementTree

ElementTree生来就是为了处理XML,它在Python标准库中有两种实现:一种是纯Python实现的,如xml.etree.ElementTree,另一种是速度快一点的xml.etree.cElementTree。注意:尽量使用C语言实现的那种,因为它速度更快,而且消耗的内存更少。
在CODE上查看代码片派生到我的代码片

  try: 
    import xml.etree.cElementTree as ET 
  except ImportError: 
    import xml.etree.ElementTree as ET 

登录后复制

这是一个让Python不同的库使用相同API的一个比较常用的办法,而从Python 3.3开始ElementTree模块会自动寻找可用的C库来加快速度,所以只需要import xml.etree.ElementTree就可以了。
在CODE上查看代码片派生到我的代码片

  #!/usr/bin/evn python 
  #coding:utf-8 
   
  try: 
    import xml.etree.cElementTree as ET 
  except ImportError: 
    import xml.etree.ElementTree as ET 
  import sys 
   
  try: 
    tree = ET.parse("country.xml")     #打开xml文档 
    #root = ET.fromstring(country_string) #从字符串传递xml 
    root = tree.getroot()         #获得root节点  
  except Exception, e: 
    print "Error:cannot parse file:country.xml." 
    sys.exit(1) 
  print root.tag, "---", root.attrib  
  for child in root: 
    print child.tag, "---", child.attrib 
   
  print "*"*10 
  print root[0][1].text   #通过下标访问 
  print root[0].tag, root[0].text 
  print "*"*10 
   
  for country in root.findall('country'): #找到root节点下的所有country节点 
    rank = country.find('rank').text   #子节点下节点rank的值 
    name = country.get('name')      #子节点下属性name的值 
    print name, rank 
      
  #修改xml文件 
  for country in root.findall('country'): 
    rank = int(country.find('rank').text) 
    if rank > 50: 
      root.remove(country) 
   
  tree.write('output.xml') 

登录后复制

运行结果:

201549105948952.png (509×377)

参考:https://docs.python.org/2/library/xml.etree.elementtree.html
2、xml.dom.*

文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。一个 DOM 的解析器在解析一个XML文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。python中用xml.dom.minidom来解析xml文件,例子如下:
在CODE上查看代码片派生到我的代码片

  #!/usr/bin/python 
  #coding=utf-8 
   
  from xml.dom.minidom import parse 
  import xml.dom.minidom 
   
  # 使用minidom解析器打开XML文档 
  DOMTree = xml.dom.minidom.parse("country.xml") 
  Data = DOMTree.documentElement 
  if Data.hasAttribute("name"): 
    print "name element : %s" % Data.getAttribute("name") 
   
  # 在集合中获取所有国家 
  Countrys = Data.getElementsByTagName("country") 
   
  # 打印每个国家的详细信息 
  for Country in Countrys: 
    print "*****Country*****" 
    if Country.hasAttribute("name"): 
     print "name: %s" % Country.getAttribute("name") 
   
    rank = Country.getElementsByTagName('rank')[0] 
    print "rank: %s" % rank.childNodes[0].data 
    year = Country.getElementsByTagName('year')[0] 
    print "year: %s" % year.childNodes[0].data 
    gdppc = Country.getElementsByTagName('gdppc')[0] 
    print "gdppc: %s" % gdppc.childNodes[0].data 
   
    for neighbor in Country.getElementsByTagName("neighbor"):  
      print neighbor.tagName, ":", neighbor.getAttribute("name"), neighbor.getAttribute("direction") 

登录后复制

运行结果:

201549110124853.png (486×264)

参考:https://docs.python.org/2/library/xml.dom.html

3、xml.sax.*

SAX是一种基于事件驱动的API,利用SAX解析XML牵涉到两个部分:解析器和事件处理器。其中解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件;而事件处理器则负责对事件作出相应,对传递的XML数据进行处理。python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler。常使用在如下的情况下:一、对大型文件进行处理;二、只需要文件的部分内容,或者只需从文件中得到特定信息;三、想建立自己的对象模型的时候。
ContentHandler类方法介绍
(1)characters(content)方法
调用时机:
从行开始,遇到标签之前,存在字符,content的值为这些字符串。
从一个标签,遇到下一个标签之前, 存在字符,content的值为这些字符串。
从一个标签,遇到行结束符之前,存在字符,content的值为这些字符串。
标签可以是开始标签,也可以是结束标签。
(2)startDocument()方法
文档启动的时候调用。
(3)endDocument()方法
解析器到达文档结尾时调用。
(4)startElement(name, attrs)方法
遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典。
(5)endElement(name)方法
遇到XML结束标签时调用。
在CODE上查看代码片派生到我的代码片

  #coding=utf-8 
  #!/usr/bin/python 
   
  import xml.sax 
   
  class CountryHandler(xml.sax.ContentHandler): 
    def __init__(self): 
     self.CurrentData = "" 
     self.rank = "" 
     self.year = "" 
     self.gdppc = "" 
     self.neighborname = "" 
     self.neighbordirection = "" 
   
    # 元素开始事件处理 
    def startElement(self, tag, attributes): 
     self.CurrentData = tag 
     if tag == "country": 
       print "*****Country*****" 
       name = attributes["name"] 
       print "name:", name 
     elif tag == "neighbor": 
       name = attributes["name"] 
       direction = attributes["direction"] 
       print name, "->", direction 
   
    # 元素结束事件处理 
    def endElement(self, tag): 
     if self.CurrentData == "rank": 
       print "rank:", self.rank 
     elif self.CurrentData == "year": 
       print "year:", self.year 
     elif self.CurrentData == "gdppc": 
       print "gdppc:", self.gdppc 
     self.CurrentData = "" 
   
    # 内容事件处理 
    def characters(self, content): 
     if self.CurrentData == "rank": 
       self.rank = content 
     elif self.CurrentData == "year": 
       self.year = content 
     elif self.CurrentData == "gdppc": 
       self.gdppc = content 
    
  if __name__ == "__main__": 
     # 创建一个 XMLReader 
    parser = xml.sax.make_parser() 
    # turn off namepsaces 
    parser.setFeature(xml.sax.handler.feature_namespaces, 0) 
   
     # 重写 ContextHandler 
    Handler = CountryHandler() 
    parser.setContentHandler(Handler) 
     
    parser.parse("country.xml") 

登录后复制

运行结果:

201549110218145.png (471×264)

4、libxml2和lxml解析xml

libxml2是使用C语言开发的xml解析器,是一个基于MIT License的免费开源软件,多种编程语言都有基于它的实现,python中的libxml2模块有点小不足的是:xpathEval()接口不支持类似模板的用法,但不影响使用,因libxml2采用C语言开发的,因此在使用API接口的方式上难免会有点不适应。
在CODE上查看代码片派生到我的代码片

  #!/usr/bin/python 
  #coding=utf-8 
   
  import libxml2 
   
  doc = libxml2.parseFile("country.xml") 
  for book in doc.xpathEval('//country'): 
    if book.content != "": 
      print "----------------------" 
      print book.content 
  for node in doc.xpathEval("//country/neighbor[@name = 'Colombia']"): 
    print node.name, (node.properties.name, node.properties.content) 
  doc.freeDoc() 

登录后复制

201549110301575.png (457×318)

lxml是以libxml2为基础采用python语言开发的,从使用层面上说比lxml更适合python开发者,且xpath()接口支持类似模板的用法。
在CODE上查看代码片派生到我的代码片

  #!/usr/bin/python 
  #coding=utf-8 
   
  import lxml.etree  
   
  doc = lxml.etree.parse("country.xml")  
  for node in doc.xpath("//country/neighbor[@name = $name]", name = "Colombia"):  
    print node.tag, node.items() 
  for node in doc.xpath("//country[@name = $name]", name = "Singapore"):  
    print node.tag, node.items() 

登录后复制

201549110332839.png (513×57)

三、总结
(1)Python中XML解析可用的类库或模块有xml、libxml2 、lxml 、xpath等,需要深入了解的还需参考相应的文档。
(2)每一种解析方式都有自己的优点和缺点,选择前可以综合各个方面的性能考虑。
(3)若有不足,请留言,在此先感谢!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何利用Debian Apache日志提升网站性能 如何利用Debian Apache日志提升网站性能 Apr 12, 2025 pm 11:36 PM

本文将阐述如何通过分析Debian系统下的Apache日志来提升网站性能。一、日志分析基础Apache日志记录了所有HTTP请求的详细信息,包括IP地址、时间戳、请求URL、HTTP方法和响应代码等。在Debian系统中,这些日志通常位于/var/log/apache2/access.log和/var/log/apache2/error.log目录下。理解日志结构是有效分析的第一步。二、日志分析工具您可以使用多种工具分析Apache日志:命令行工具:grep、awk、sed等命令行工具可

Python:游戏,Guis等 Python:游戏,Guis等 Apr 13, 2025 am 12:14 AM

Python在游戏和GUI开发中表现出色。1)游戏开发使用Pygame,提供绘图、音频等功能,适合创建2D游戏。2)GUI开发可选择Tkinter或PyQt,Tkinter简单易用,PyQt功能丰富,适合专业开发。

PHP和Python:比较两种流行的编程语言 PHP和Python:比较两种流行的编程语言 Apr 14, 2025 am 12:13 AM

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

Debian Sniffer在DDoS攻击检测中的作用 Debian Sniffer在DDoS攻击检测中的作用 Apr 12, 2025 pm 10:42 PM

本文探讨DDoS攻击检测方法,虽然未找到“DebianSniffer”的直接应用案例,但以下方法可用于DDoS攻击检测:有效的DDoS攻击检测技术:基于流量分析的检测:通过监控网络流量的异常模式,例如突发性的流量增长、特定端口的连接数激增等,来识别DDoS攻击。这可以使用多种工具实现,包括但不限于专业的网络监控系统和自定义脚本。例如,Python脚本结合pyshark和colorama库可以实时监控网络流量并发出警报。基于统计分析的检测:通过分析网络流量的统计特征,例如数据

Nginx SSL证书更新Debian教程 Nginx SSL证书更新Debian教程 Apr 13, 2025 am 07:21 AM

本文将指导您如何在Debian系统上更新NginxSSL证书。第一步:安装Certbot首先,请确保您的系统已安装certbot和python3-certbot-nginx包。若未安装,请执行以下命令:sudoapt-getupdatesudoapt-getinstallcertbotpython3-certbot-nginx第二步:获取并配置证书使用certbot命令获取Let'sEncrypt证书并配置Nginx:sudocertbot--nginx按照提示选

debian readdir如何与其他工具集成 debian readdir如何与其他工具集成 Apr 13, 2025 am 09:42 AM

Debian系统中的readdir函数是用于读取目录内容的系统调用,常用于C语言编程。本文将介绍如何将readdir与其他工具集成,以增强其功能。方法一:C语言程序与管道结合首先,编写一个C程序调用readdir函数并输出结果:#include#include#includeintmain(intargc,char*argv[]){DIR*dir;structdirent*entry;if(argc!=2){

Python和时间:充分利用您的学习时间 Python和时间:充分利用您的学习时间 Apr 14, 2025 am 12:02 AM

要在有限的时间内最大化学习Python的效率,可以使用Python的datetime、time和schedule模块。1.datetime模块用于记录和规划学习时间。2.time模块帮助设置学习和休息时间。3.schedule模块自动化安排每周学习任务。

Debian OpenSSL如何配置HTTPS服务器 Debian OpenSSL如何配置HTTPS服务器 Apr 13, 2025 am 11:03 AM

在Debian系统上配置HTTPS服务器涉及几个步骤,包括安装必要的软件、生成SSL证书、配置Web服务器(如Apache或Nginx)以使用SSL证书。以下是一个基本的指南,假设你使用的是ApacheWeb服务器。1.安装必要的软件首先,确保你的系统是最新的,并安装Apache和OpenSSL:sudoaptupdatesudoaptupgradesudoaptinsta

See all articles