XML解析2(SAX)

来源:互联网 发布:淘宝到第三层级 编辑:程序博客网 时间:2024/06/04 19:10

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=Nonedef 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=Nonedef 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,重写方法的时候也没有提示,很疑惑。不过倒是运行没有错误。

原创粉丝点击