sax (用于处理XML事件驱动的推模型)
SAX,全称Simple API for XML,既是一种接口,也是一种软件包。它是一种XML解析的替代方法。SAX不同于DOM解析,它逐行扫描文档,一边扫描一边解析。由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势。
—————————-JAVA———————————-
1.创建工厂
//SAXParserFactory抽象类,新建一个有两种方式,1.新建抽象类的instance.2.新建抽象类的实现类
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParserFactory spf = new SAXParserFactoryImpl();
2.创建解析对象
SAXParser sp = spf.newSAXParser();
3.解析器绑定处理器
重写这五个方法就可以开始解析
InputStream in = SaxTest.class.getClassLoader().getResourceAsStream("com/bigdata/BBTree/people.xml");
sp.parse(in,/*解析事件1.匿名内部类*/new DefaultHandler(){
@Override
public void startDocument() throws SAXException {}
@Override
public void endDocument() throws SAXException {}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException{}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {}
可设置个tag对象,在startElement方法里,接受qname对象,也就是标签,当碰到需要处理的标签时,在characters里面进行处理就好了,注意必须在endElement里将tag置为Null.
以解析name为例,tag=name,然后name标签处理完了之后,tag不重置的话,仍然为name,而characters会接着处理<\name>标签后的(\n以及空格),这就将会导致前面的数据丢失或者造成异常。
—————————-PYTHON———————————-
1.导包
import xml.sax
2.创建解析器
parse=xml.sax.make_parser()
3.定义事件处理类
class MyHandle(xml.sax.ContentHandler):
def __init__(self):
self.person=None
self.tag=None
def startElement(self,name,attrs):
self.tag=name
if name =='person':
self.person =Person()
def endElement(self,name):
if name=='person':
global people
people.append(self.person)
self.person=None
self.tag=None
def characters(self,content):
if "name"==self.tag:
self.person.name=content
if "age"==self.tag:
self.person.age=int(content)
if "tel"==self.tag:
self.person.tel=content
4.给解析器绑定事件处理器
parse.setContentHandler(MyHandle())
5.解析xml(JAVA不需要这一步)
parse.parse('people.xml')
码代码的过程中,发现idea全程都没有提示,myhandler类明明是继承的contenthandler,重写方法的时候也没有提示,很疑惑。不过倒是运行没有错误。