XML解析2(SAX)

4 篇文章 0 订阅
2 篇文章 0 订阅

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值