标签:python解析xml dom elementtree
常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同。
python有三种方法解析XML,SAX,DOM,以及ElementTree:
pyhton 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。
将XML数据在内存中解析成一个树,通过对树的操作来操作XML。
文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。
一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。
ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。
1.加载xml文件
加载XML文件共有2种方法,一是加载指定字符串,二是加载指定文件
2.获取element的方法
a) 通过getiterator
b) 过 getchildren
c) find方法
d) findall方法
注:因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)。
# coding: utf-8 # FileName: testXml.py # 方法一测试解析XML文件,采用xml.dom方式 import xml.dom.minidom xmlfile = r‘E:\Program\python\testxml.xml‘ def TestXmlUseDom(): DOMTree = xml.dom.minidom.parse(xmlfile) # 获取根节点 root = DOMTree.documentElement # 获取属性 if root.hasAttribute("shelf"): print "Root element: %s" % root.getAttribute("shelf") # 获取子节点 movies = root.getElementsByTagName("movie") for move in movies: print "*****Movie******" if move.hasAttribute("Title"): print "Movie : %s", move.getAttribute("Title") # 节点的文本,data t = move.getElementsByTagName("type")[0] print "Type: %s" % t.childNodes[0].data f = move.getElementsByTagName("format")[0] print "format: %s" % f.childNodes[0].data TestXmlUseDom() # 方法二,使用ElementTree from xml.etree import ElementTree as ET def print_node(node): ‘‘‘打印节点‘‘‘ print "==========================" # 返回属性是一个字典格式 print "node.attrib: %s" % node.attrib if node.attrib.has_key("title"): print "node.attrib[‘title‘]: %s" % node.attrib[‘title‘] # tag 节点名称 print "node.tag:%s" % node.tag # text 节点内容 print "node.text:%s" % node.text def TestXmlET(): print "TestXmlET" # 加载文件 root = ET.parse(xmlfile) # 从文本加载 # root = ET.fromstring(text) # 遍历子节点 lst_node = root.getiterator("movie") for node in lst_node: print_node(node) # 获取第一个节点movie print "first movie:" # 获取所有子节点getchildren lst_node_child = lst_node[0].getchildren()[0] print_node(lst_node_child) print "find movie:" node_find = root.find("movie") print_node(node_find) # findall,查找所有的 node_findall = root.findall("movie")[1] print_node(node_findall) # 直接使用路径查找 node_findone = root.find("movie/type") print_node(node_findone) # 直接使用路径查找 node_findall2 = root.findall("movie/type") for node in node_findall2: print_node(node_findone) TestXmlET()
标签:python解析xml dom elementtree
原文地址:http://8796902.blog.51cto.com/8786902/1565153