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。
文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。
一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。
3.ElementTree(元素树)
ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。
1.加载xml文件
加载XML文件共有2种方法,一是加载指定字符串,二是加载指定文件
2.获取element的方法
a) 通过getiterator
b) 过 getchildren
c) find方法
d) findall方法
# 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()