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