由于最近工作上需要大量XML文件里的内容,一个一个查看提取的话估计得到明年才能完事,不由得想起用Python写个小程序来解决这件事情。
XML是指可扩展标记语言,被设计用来传输和存储数据。本章节使用的XML实例文件works.xml内容如下:
敦刻尔克
诺兰
我的职业是小说家
村上春树
Python对XML的解析采用SAX (simple API for XML )模块。
python 标准库包含SAX解析器,SAX是一种基于事件驱动的API,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器。解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件;而事件处理器则负责对事件作出相应,对传递的XML数据进行处理。在python中使用sax方式处理xml要先引入xml.sax.parse(),还有xml.sax.handler.ContentHandler。
ContentHandler类方法介绍:
characters(content)方法:
调用时机:
从行开始,遇到标签之前,存在字符,content的值为这些字符串。
从一个标签,遇到下一个标签之前, 存在字符,content的值为这些字符串。
从一个标签,遇到行结束符之前,存在字符,content的值为这些字符串。
标签可以是开始标签,也可以是结束标签。
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对象
Python解析XML实例:
#!/usr/bin/python3
#encoding=utf-8
import xml.sax
import xml.sax.handler
class WorksHandler(xml.sax.ContentHandler):
def __init__(self):
self.CurrentData = ""
self.names = ""
self.author = ""
#元素开始事件处理
def startElement(self, tag, attributes):
self.CurrentData = tag
if tag == "works":
print("***内容***")
title = attributes["title"]
print("类型:",title)
#元素结束事件处理
def endElement(self, tag):
if self.CurrentData == "names":
print("名称:",self.names)
elif self.CurrentData == "author":
print("作者:",self.author)
self.CurrentData = ""
#内容事件处理
def characters(self, content):
if self.CurrentData == "names":
self.names = content
elif self.CurrentData == "author":
self.author = content
if (__name__ == "__main__"):
#创建一个XMLReader
parser = xml.sax.make_parser()
parser.setFeature(xml.sax.handler.feature_namespaces,0)
#重写ContextHandler
Handler = WorksHandler()
parser.setContentHandler(Handler)
parser.parse("works.xml")
以上代码执行结果如下:***内容***
类型: 电影
名称: 敦刻尔克
作者: 诺兰
***内容***
类型: 书籍
名称: 我的职业是小说家
作者: 村上春树
保存至TXT文件:python3 read_xml.py > works.txt
待解决问题:
(1)、不通过命令“>"如何保存提取的XML文件内容?
(2)、解析多个文件时,对于个别文件不存在的标签、属性名称如何判断?