Python中使用ElementTree解析XML示例

   这篇文章主要介绍了Python中使用ElementTree解析XML示例,本文同时讲解了XML基本概念介绍、XML几种解析方法和ElementTree解析实例,需要的朋友可以参考下

  【XML基本概念介绍】

  XML 指可扩展标记语言(eXtensible Markup Language)。

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

  概念一:

  代码如下:

   # foo元素的起始标签

   # foo元素的结束标签

  # note: 每一个起始标签必须有对应的结束标签来闭合, 也可以写成

  概念二:

  代码如下:

   # 元素可以嵌套到任意参次

   # bar元素为foo元素的子元素

   # 父元素foo的结束标签

  概念三:

   代码如下:

   # foo元素有个lang的属性,该属性值为: EN;对应Python字典(Name-Value)对;

   # bar元素有个lang的属性,该属性值为: CH;还有个id属性,值为:001,放置在''或“”中;

   # bar元素中的lang属性不会和foo元素中相冲突,每个元素都有独立的属性集;

  概念四:

   代码如下:

   # 元素可以有文本内容

  # Note:如果一个元素即没有文本内容,也没有子元素,则为空元素。

  概念五:

   代码如下:

   # info元素为根节点

A
# list元素为子节点

B

C

  

  概念六:

   代码如下:

   # 可以通过声明xmlns来定义默认名字空间,feed元素处于http://www.w3.org/2005/Atom命名空间中

   # title元素也是。名字空间声明不仅会作用于当前声明它的元素,还会影响到该元素的所有子元素

  

  也可以通过xmlns:prefix声明来定义一个名字空间并取其名为prefix。

  然后该名字空间中的每个元素都必须显式地使用这个前缀(prefix)来声明。

   # feed属于命名空间atom

  dive into mark # title元素同样属于该命名空间

   # xmlns(XML Name Space)

  【XML几种解析方法】

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

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

  1.SAX (Simple API for XML )

  Pyhton标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。SAX是一种基于事件驱动的API。利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器。

  解析器负责读取XML文档,并向事件处理器发送事件,如元素开始及结束事件;而事件处理器则负责对事件作出处理。

  优点:SAX流式读取XML文件,比较快,占用内存少。

  缺点:需要用户实现回调函数(handler)。

  2.DOM(Document Object Model)

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

  优点:使用DOM的好处是你不需要对状态进行追踪,因为每一个节点都知道谁是它的父节点,谁是子节点.

  缺点:DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,使用起来也比较麻烦!

  3.ElementTree(元素树)

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

  相比而言,第三种方法,即方便,又快速,我们一直用它!下面介绍用元素树如何解析XML:

  【ElementTree解析】

  两种实现

  ElementTree生来就是为了处理XML ,它在Python标准库中有两种实现。

  一种是纯Python实现,例如: xml.etree.ElementTree

  另外一种是速度快一点的: xml.etree.cElementTree

  尽量使用C语言实现的那种,因为它速度更快,而且消耗的内存更少! 在程序中可以这样写:

   代码如下:

  try:

  import xml.etree.cElementTree as ET

  except ImportError:

  import xml.etree.ElementTree as ET

  常用方法

   代码如下:

  # 当要获取属性值时,用attrib方法。

  # 当要获取节点值时,用text方法。

  # 当要获取节点名时,用tag方法。

  示例XML

   代码如下:

  

  

  Book message

  bookone

  python check

  001

200

  

  booktwo

  python learn

  002

300

  

  

  ###########

  ## 加载XML

  ###########

  方法一:加载文件

   代码如下:

  root = ET.parse('book.xml')

  方法二:加载字符串

   代码如下:

  root = ET.fromstring(xmltext)

  ###########

  ## 获取节点

  ###########

  方法一:获得指定节点->getiterator()方法

  代码如下:

  book_node = root.getiterator('list')

  方法二:获得指定节点->findall()方法

  代码如下:

  book_node = root.findall('list')

  方法三:获得指定节点->find()方法

   代码如下:

  book_node = root.find('list')

  方法四:获得儿子节点->getchildren()

  代码如下:

  for node in book_node:

  book_node_child = node.getchildren()[0]

  print book_node_child.tag, '=> ', book_node_child.text

  ###########

  ## 例子01

  ###########

  复制代码 代码如下:

  # coding=utf-8

  try: # 导入模块

  import xml.etree.cElementTree as ET

  except ImportError:

  import xml.etree.ElementTree as ET

  root = ET.parse('book.xml') # 分析XML文件

  books = root.findall('/list') # 查找所有根目录下的list的子节点

  for book_list in books: # 对查找后的结果遍历

  print "=" * 30 # 输出格式

  for book in book_list: # 对每个子节点再进行遍历,找出里面你的属性及值

  if book.attrib.has_key('id'): # 一句id来做条件判断

  print "id:", book.attrib['id'] # 根据id打印出属性值

  print book.tag + '=> ' + book.text # 输出标签及文本内容

  print "=" * 30

  输出结果:

  代码如下:

  ==============================

  head=> bookone

  name=> python check

  number=> 001

  page=> 200

  ==============================

  head=> booktwo

  name=> python learn

  number=> 002

  page=> 300

  ==============================

时间: 2025-01-19 13:07:09

Python中使用ElementTree解析XML示例的相关文章

在java中使用dom4j解析xml(示例代码)_java

虽然Java中已经有了Dom和Sax这两种标准解析方式 但其操作起来并不轻松,对于我这么一个初学者来说,其中部分代码是活生生的恶心 为此,伟大的第三方开发组开发出了Jdom和Dom4j等工具 鉴于目前的趋势,我们这里来讲讲Dom4j的基本用法,不涉及递归等复杂操作 Dom4j的用法很多,官网上的示例有那么点儿晦涩,这里就不写了 首先我们需要出创建一个xml文档,然后才能对其解析 xml文档: 复制代码 代码如下: <?xml version="1.0" encoding=&quo

急急!为什么Applet中运用JDOM解析XML文件时,构造文档时失败啊

问题描述 为什么Applet中运用JDOM解析XML文件时,构造文档时失败啊SAXBuildersb=newSAXBuilder();Documentdoc=sb.build("E:/sample.xml");在main()程序中就不会有这样的问题,是不是安全问题请各路大侠帮忙了,谢啦!!!

java中使用sax解析xml的解决方法_java

在java中,原生解析xml文档的方式有两种,分别是:Dom解析和Sax解析 Dom解析功能强大,可增删改查,操作时会将xml文档以文档对象的方式读取到内存中,因此适用于小文档 Sax解析是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档 本文主要讲解Sax解析,其余放在后面 Sax采用事件驱动的方式解析文档.简单点说,如同在电影院看电影一样,从头到尾看一遍就完了,不能回退(Dom可来来回回读取) 在看电影的过程中,每遇到一个情节,一段泪水,一次擦肩,你都会调动大脑和神经去接收或

Android App中使用Pull解析XML格式数据的使用示例_Android

 Pull解析XML文件的方式与SAX解析XML文件的方式大致相同,他们都是基于事件驱动的.所以,利用pull解析XML文件需要下面几个步骤:      1)通过XMLPullParserFactory获取XMLPullParser对象.      2)通过XMLPullParser对象设置输入流.      3)通过parser.next(),持续的解析XML文件直到文件的尾部. 下面的几个方法是经常需要的:XMLPullParserFacotry.newInstance( )    faco

iOS开发中常见的解析XML的类库以及简要安装方法_IOS

在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.KissXML.TinyXML和GDataXML.问题是应该选择哪一个呢? 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值.而且通常情况下,可以借助XPath,直接查询XML节点. SAX

VC++中利用MSXML解析XML文档

c++|xml 四.程序实现 下面通过一个具体的实例来说明在VC++中如何利用MSXML解析XML文档. (1)源XML文档(xmlfile.xml)如下: <?xml version="1.0" encoding="GB2312"?> <Device id="10041" name="设备1"> <Type>13</Type> <TypeName>保护</Ty

Ruby程序中创建和解析XML文件的方法_ruby专题

使用builder创建XML builder安装方法: gem install builder require 'builder' x = Builder::XmlMarkup.new(:target => $stdout, :indent => 1) #":target =>$stdout"参数:指示输出内 容将被写向标准输出控制台 #":indent =>1"参数:XML输出形式将被缩 进一个空格字符x.instruct! :xml, :

使用jquery解析XML示例代码_jquery

xml文件结构:books.xml <?xml version="1.0" encoding="UTF-8"?> <root> <book id="1"> <name>深入浅出extjs</name> <author>张三</author> <price>88</price> </book> <book id="

Android中使用sax解析xml文件的方法_Android

SAX是一个解析速度快并且占用内存少的xml解析器,非常适合用于Android等移动设备. SAX解析XML文件采用的是事件驱动,也就是说,它并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否合法XML 语法中的某部分,如果符合就会触发事件.所谓事件,其实就是一些回调(callback)方法,这些方法(事件)定义在ContentHandler接口.下面是一些ContentHandler接口常用的方法: startDocument():当遇到文档的开头的时候,调用