python对XML的解析
常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同。
python有三种方法解析XML,SAX,DOM,以及ElementTree:
1.SAX (simple API for XML )
python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。
2.DOM(Document Object Model)
将XML数据在内存中解析成一个树,通过对树的操作来操作XML。
本章节使用到的XML实例文件movies.x
有一xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<newis>
<newi>
<name>zhangsan</name>
<age>19</age>
<sex>男</sex>
</newi>
<newi>
<name>lisi</name>
<age>22</age>
<sex>男</sex>
</newi>
<newi>
<name>wangwu</name>
<age>18</age>
<sex>女</sex>
</newi>
</newis>
使用xml.dom解析xml
文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。
一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。
python中用xml.dom.minidom来解析xml文件 列如:
from xml.dom.minidom import parse
#加载xml文件
domTree = parse("newis.xml")
print(domTree)
root = domTree.documentElement
print(root)
#xml中的子节点
ps = root.getElementsByTagName("newi")
#domTree.getElementsByTagName()
#循环打印xml的内容
for p in ps:
print(p.getElementsByTagName("name")[0].childNodes[0].data)
print(p.getElementsByTagName("age")[0].childNodes[0].data)
print(p.getElementsByTagName("sex")[0].childNodes[0].data)
结果如下:
<xml.dom.minidom.Document object at 0x000001A70F1FE588>
<DOM Element: newis at 0x1a70ef9ecc0>
zhangsan
19
男
lisi
22
男
wangwu
18
女
python使用SAX解析xml
SAX是一种基于事件驱动的API。
利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器。
解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件;
而事件处理器则负责对事件作出相应,对传递的XML数据进行处理。
1、对大型文件进行处理;
- 2、只需要文件的部分内容,或者只需从文件中得到特定信息。
- 3、想建立自己的对象模型的时候。
在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler。
ContentHandler类方法介绍
characters(content)方法
调用时机:
从行开始,遇到标签之前,存在字符,content的值为这些字符串。
从一个标签,遇到下一个标签之前, 存在字符,content的值为这些字符串。
从一个标签,遇到行结束符之前,存在字符,content的值为这些字符串。
标签可以是开始标签,也可以是结束标签。 列如:
from xml.sax import parse as par
import xml.sax
from xml.sax import ContentHandler
class newi:
def __init__(self,name=None,age=None,sex=None):
self.name = name
self.age = age
self.sex = sex
def __str__(self):
return "{0}\t{1}\t{2}".format(self.name,self.age,self.sex)
newis =[]
class myh(ContentHandler):
def __init__(self):
self.newi = None
self.tag = None
# 读取元素内容时调用(content:文本内容)
def characters(self, content):
if self.tag == "name":
self.newi.name =content
if self.tag == "age":
self.newi.age = content
if self.tag == "sex":
self.newi.sex = content
# 元素结束调用(name:元素名称)
def startElement(self, name, attrs):
self.tag = name
if name == "newi":
self.newi = newi()
# 元素开始调用(name:元素名称,attrs:元素属性)
def endElement(self, name):
if name == 'newi':
global newis # 引用外部的全局变量
newis.append(self.newi)
self.newi = None
self.tag = None
# 创建一个 XMLReader
parser = xml.sax.make_parser()
# 关闭命名空间(不验证命名空间)
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# 重写 ContextHandler
parser.setContentHandler(myh())
# 解析xml文档
parser.parse("newis.xml")
for y in newis:
print(y)
结果如下:
zhangsan 19 男
lisi 22 男
wangwu 18 女