天天看点

Python解析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。

文件对象模型(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()