Python XML解析


什么是XML?

XML 指可扩展标记语言(eXtensible Markup Language)。 你可以通过本站学习XML教程

XML 被设计用来传输和存储数据。

XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。

它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。


python对XML的解析

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

python有三种方法解析XML,SAX,DOM,以及ElementTree:

1.SAX (simple API for XML )

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

2.DOM(Document Object Model)

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

3.ElementTree(元素树)

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

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

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

<collection shelf="New Arrivals"><movie title="Enemy Behind">   <type>War, Thrillertype>   <format>DVDformat>   <year>2003year>   <rating>PGrating>   <stars>10stars>   <description>Talk about a US-Japan wardescription>movie><movie title="Transformers">   <type>Anime, Science Fictiontype>   <format>DVDformat>   <year>1989year>   <rating>Rrating>   <stars>8stars>   <description>A schientific fictiondescription>movie>   <movie title="Trigun">   <type>Anime, Actiontype>   <format>DVDformat>   <episodes>4episodes>   <rating>PGrating>   <stars>10stars>   <description>Vash the Stampede!description>movie><movie title="Ishtar">   <type>Comedytype>   <format>VHSformat>   <rating>PGrating>   <stars>2stars>   <description>Viewable boredomdescription>movie>collection>

python使用SAX解析xml

SAX是一种基于事件驱动的API。

利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器。

解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件;

而事件处理器则负责对事件作出相应,对传递的XML数据进行处理。

  • 1、对大型文件进行处理;

  • 2、只需要文件的部分内容,或者只需从文件中得到特定信息。

  • 3、想建立自己的对象模型的时候。

在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler。

ContentHandler类方法介绍

characters(content)方法

调用时机:

从行开始,遇到标签之前,存在字符,content的值为这些字符串。

从一个标签,遇到下一个标签之前, 存在字符,content的值为这些字符串。

从一个标签,遇到行结束符之前,存在字符,content的值为这些字符串。

标签可以是开始标签,也可以是结束标签。

startDocument()方法

文档启动的时候调用。

endDocument()方法

解析器到达文档结尾时调用。

startElement(name, attrs)方法

遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典。

endElement(name)方法

遇到XML结束标签时调用。


make_parser方法

以下方法创建一个新的解析器对象并返回。

xml.sax.make_parser( [parser_list] )

参数说明:

  • parser_list - 可选参数,解析器列表


parser方法

以下方法创建一个 SAX 解析器并解析xml文档:

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

参数说明:

  • xmlfile - xml文件名

  • contenthandler - 必须是一个ContentHandler的对象

  • errorhandler - 如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象


parseString方法

parseString方法创建一个XML解析器并解析xml字符串:

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

参数说明:

  • xmlstring - xml字符串

  • contenthandler - 必须是一个ContentHandler的对象

  • errorhandler - 如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象


Python 解析XML实例

#coding=utf-8#!/usr/bin/pythonimport xml.saxclass MovieHandler( xml.sax.ContentHandler ):   def __init__(self):      self.CurrentData = ""      self.type = ""      self.format = ""      self.year = ""      self.rating = ""      self.stars = ""      self.description = ""   # 元素开始事件处理   def startElement(self, tag, attributes):      self.CurrentData = tag      if tag == "movie":         print "*****Movie*****"         title = attributes["title"]         print "Title:", title   # 元素结束事件处理   def endElement(self, tag):      if self.CurrentData == "type":         print "Type:", self.type      elif self.CurrentData == "format":         print "Format:", self.format      elif self.CurrentData == "year":         print "Year:", self.year      elif self.CurrentData == "rating":         print "Rating:", self.rating      elif self.CurrentData == "stars":         print "Stars:", self.stars      elif self.CurrentData == "description":         print "Description:", self.description      self.CurrentData = ""   # 内容事件处理   def characters(self, content):      if self.CurrentData == "type":         self.type = content      elif self.CurrentData == "format":         self.format = content      elif self.CurrentData == "year":         self.year = content      elif self.CurrentData == "rating":         self.rating = content      elif self.CurrentData == "stars":         self.stars = content      elif self.CurrentData == "description":         self.description = content  if ( __name__ == "__main__"):      # 创建一个 XMLReader   parser = xml.sax.make_parser()   # turn off namepsaces   parser.setFeature(xml.sax.handler.feature_namespaces, 0)   # 重写 ContextHandler   Handler = MovieHandler()   parser.setContentHandler( Handler )      parser.parse("movies.xml")

以上代码执行结果如下:

*****Movie*****Title: Enemy BehindType: War, ThrillerFormat: DVDYear: 2003Rating: PGStars: 10Description: Talk about a US-Japan war*****Movie*****Title: TransformersType: Anime, Science FictionFormat: DVDYear: 1989Rating: RStars: 8Description: A schientific fiction*****Movie*****Title: TrigunType: Anime, ActionFormat: DVDRating: PGStars: 10Description: Vash the Stampede!*****Movie*****Title: IshtarType: ComedyFormat: VHSRating: PGStars: 2Description: Viewable boredom

完整的 SAX API 文档请查阅Python SAX APIs


使用xml.dom解析xml

文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。

一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。

python中用xml.dom.minidom来解析xml文件,实例如下:

#coding=utf-8#!/usr/bin/pythonfrom xml.dom.minidom import parseimport xml.dom.minidom# 使用minidom解析器打开 XML 文档DOMTree = xml.dom.minidom.parse("movies.xml")collection = DOMTree.documentElementif collection.hasAttribute("shelf"):   print "Root element : %s" % collection.getAttribute("shelf")# 在集合中获取所有电影movies = collection.getElementsByTagName("movie")# 打印每部电影的详细信息for movie in movies:   print "*****Movie*****"   if movie.hasAttribute("title"):      print "Title: %s" % movie.getAttribute("title")   type = movie.getElementsByTagName('type')[0]   print "Type: %s" % type.childNodes[0].data   format = movie.getElementsByTagName('format')[0]   print "Format: %s" % format.childNodes[0].data   rating = movie.getElementsByTagName('rating')[0]   print "Rating: %s" % rating.childNodes[0].data   description = movie.getElementsByTagName('description')[0]   print "Description: %s" % description.childNodes[0].data

以上程序执行结果如下:

Root element : New Arrivals*****Movie*****Title: Enemy BehindType: War, ThrillerFormat: DVDRating: PGDescription: Talk about a US-Japan war*****Movie*****Title: TransformersType: Anime, Science FictionFormat: DVDRating: RDescription: A schientific fiction*****Movie*****Title: TrigunType: Anime, ActionFormat: DVDRating: PGDescription: Vash the Stampede!*****Movie*****Title: IshtarType: ComedyFormat: VHSRating: PGDescription: Viewable boredom

完整的 DOM API 文档请查阅Python DOM APIs。

c语言解析xml字符串_Python XML解析相关推荐

  1. c语言解析xml字符串_Python XML解析和处理(三十二)

    XML是一种便携式的开源语言,允许程序员开发可由其他应用程序读取的应用程序,而不管操作系统和/或开发语言是什么. 1.什么是XML? 可扩展标记语言(XML)是一种非常像HTML或SGML的标记语言. ...

  2. xml字符串转xml对象,xml对象转json对象

    xml字符串转xml对象: function loadXml(str) {if (str == null) {return null;}var doc = str;try{doc = createXM ...

  3. js解析xml字符串或xml文件,将其转换为xml对象方法

    注:判断是否是ie浏览器和非ie浏览器的方法有多种,在此只介绍用例中的方法: 1.解析xml字符串,得到xml对象的方式: function createXml(str){if(document.al ...

  4. php 字符串转换xml,php 数组转xml字符串、xml字符串转数组方法案例

    数组转xml字符串方法:两种方法/** * 数组转xml字符串方法1 * @param  arary $data 数组数据 * @param  boolean $type 是否需要根节 */ func ...

  5. c#解析json字符串数组_C#解析JSON字符串总结

    JSON文件读取到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串. 操作JSON通常有以下几种方式: 1. 原始方式:按照JSON字符串自己来解析. 2. 通用方式[★★★★★]: ...

  6. python里遍历筛选xml文件_python xml.etree.ElementTree遍历xml所有节点实例详解

    python xml.etree.ElementTree遍历xml所有节点 XML文件内容: 代码: #-*- coding: UTF-8 -*- # 从文件中读取数据 import xml.etre ...

  7. python xml字符串_python -解析字符串,并返回xml格式字符串 急该如何解决

    python --解析字符串,并返回xml格式字符串 急急急. str = """Registrations: ============================= ...

  8. oracle解析xml字符串命名空间,XML命名空间

    命名空间是一组唯一的名称.命名空间是一种机制通过该元素和属性的名字可以被分配到组.该命名空间是确定的URI(统一资源标识符). 命名空间声明 命名空间声明是使用保留的属性.这样的属性名称必须是XMLN ...

  9. java 解析xml字符串的_java 解析xml字符串

    在做第三方接口测试的时候很容遇到接口返回的数据类型是xml串.把我解决问题的方法记录下来,供参考. 需要引入dom4j的jar包: package com.test; import java.util ...

最新文章

  1. 新华网泸州分频道报道IT诗人
  2. BLE蓝牙核心数据库结构解析
  3. linux-shell命令之file【辨识文件类型】
  4. CF1368G Shifting Dominoes(扫描线求矩阵的并集)
  5. 7种常用p2p共享协议
  6. Nginx基本数据结构之ngx_hash_wildcard_t
  7. 去oracle过程,记一次Oracle数据恢复过程
  8. OO思想(只留做自己看理解)
  9. 中国的 GitHub 要来了?
  10. swf播放器air android 版,网极SWF播放器安卓版
  11. 计算机专业那种高薪,中科院计算所博士平均年薪都超过50万了,计算机专业真是可以无脑选的那种...
  12. 文件无法删除 你需要计算机管理员 提供的权限才能对此文件进行更改解决办法
  13. 纯前端项目文件部署到远程服务器
  14. 如何将某一文件添加到信任列表?
  15. 压力测试软件怎么用,鲁大师温度压力测试如何使用
  16. SAP 采购订单历史价格跟物料凭证价格不一致问题
  17. Latent semantic analysis (LSA)
  18. Redis 初解缓存
  19. Emacs快捷键相关
  20. Unity即将内置骨骼动画插件Anima2D

热门文章

  1. leetcode 567. Permutation in String 字符串的排列 滑动窗口法
  2. 正视自己的所想所求,活出真实的自己
  3. debian 10 静态ip配置
  4. 【B/S实践】解决:vs中修改样式表后不起作用的问题
  5. CentOS 安装docker.ce报错提示containerd.io >= 1.2.2-3问题
  6. Python机器学习——DBSCAN聚类
  7. react非常适合入门者学习使用的后台管理框架
  8. Linux 交叉编译简介
  9. 系统芯片(SOC)架构- Aviral Mittal
  10. 芯片内亿万的晶体管制程工艺