XML解析2(SAX)

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,重寫方法的時候也沒有提示,很疑惑。不過倒是運行沒有錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章