使用SAX处理xml 实际上有一个固定的框架,即标签开始,标签结束,文本处理。以下面例子讲解
出来book.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
SAX代码如下:
from xml.parsers.expat import ParserCreate #从xml分析器中导入自定义的分析器
class DefaultSaxHander(object): #建一个默认的Sax处理器(当然类的名字可以自己定义)
def start_element(self,name,attrs): #标签处理开始,有标签名和属性
self.name = name
print('element: %s, attrs: %s' %(self.name,str(attrs)))
def end_element(self,name): #标签处理结束
print('end element: %s' % name)
def char_data(self,text): #处理文本
if text.strip(): #如果有text的前后有空格,\n,\t等,则去掉,如果内容仅仅为\t\n或空格则不打印
print('%s\'s text is %s'%(self.name,text))
handler = DefaultSaxHander() #生成Sax处理器
#初始化分析器
parser = ParserCreate()
parser.StartElementHandler = handler.start_element
parser.EndElementHandler = handler.end_element
parser.CharacterDataHandler = handler.char_data
#打开文本,读取文件
with open(r'/media/sf_Share/LSPE/r_0.11/book.xml','r') as f:
parser.Parse(f.read()) #整个文件一起读(大文件可以一行一行读取)
以上就是一个sax处理器的基本模样,有三部分,标签开始,标签结束,和文本处理,当一切都定义好之后就直接将值扔给ParserCreate,它自己内部知道怎么处理,所以像parser.StartElementHandler、parser.EndElementHandler,parser.CharacterDataHandler这些名字是默认的,不能写错,如Start写成star则会找不到模块。
结果如下:
element: bookstore, attrs: {} #找到的第一个标签名为bookstore,属性为空,即没有属性
element: book, attrs: {} #第二个标签为book,属性为空
element: title, attrs: {'lang': 'eng'} #第三个标签为title,属性名为lang,值为eng
title's text is Harry Potter #文本内容
end element: title #title结束,进入下一个标签
element: price, attrs: {} #标签为price,没有属性
price's text is 29.99 #标签内容
end element: price
end element: book
element: book, attrs: {}
element: title, attrs: {'lang': 'eng'}
title's text is Learning XML
end element: title
element: price, attrs: {}
price's text is 39.95
end element: price
end element: book #结束book标签
end element: bookstore #结束bookstore标签
从上面看到,SAX解析出来的xml是有层级的,一层一层处理