唉,這也是迫于無奈。當初看Exodus的代碼的時候,還嘲笑他為什么要自己去做那么多XML解析的工作。現在才發現,還真的不得不自己來做。
XMPP的XML Stream的形式就是一篇XML Document分節發過來。所以理想狀況是這邊接收到一點XML就Push到一個SAX Parser中,然后得到SAX Event把累積的XML交給一個DOM Parser解析出各個XML Stanza。這里一個問題是沒有這樣的SAX Parser允許你收一點那邊做一點的。一般是會讀到了EOF就罷工了的。而且從SAX Event中你也很難得到你要的XML Stanza起始位置和終結位置從而取出XML交給DOM Parser。結果往往是要自己從SAX Event中跳過DOM Parser自己來完成DOM的組裝過程。
我現在的做法就是從SAX Parser中剝離出tokenizer部分,然后自己來做SAX解析,并且把不能解析的部分留給下一次,與下次Push進來的XML一起做解析。然后自己根據tokenizer取出的token的信息來拼裝簡版的DOM(只有Element和Text,但是對XMPP已經夠用了,不夠再加)。最后的形式就是這邊提供一個Push方法,以及五個事件OnStreamBegin, OnStreamEnd, OnStanza, OnStreamError, OnParserError。
一開始的時候嘗試過完全自己來寫,發現那些代碼太丑了,還是用別人寫好了的比較好。無論如何,總算避免了完全手工的字符串比對,比Exodus那一套是強得多了。
XMPP的XML Stream的形式就是一篇XML Document分節發過來。所以理想狀況是這邊接收到一點XML就Push到一個SAX Parser中,然后得到SAX Event把累積的XML交給一個DOM Parser解析出各個XML Stanza。這里一個問題是沒有這樣的SAX Parser允許你收一點那邊做一點的。一般是會讀到了EOF就罷工了的。而且從SAX Event中你也很難得到你要的XML Stanza起始位置和終結位置從而取出XML交給DOM Parser。結果往往是要自己從SAX Event中跳過DOM Parser自己來完成DOM的組裝過程。
我現在的做法就是從SAX Parser中剝離出tokenizer部分,然后自己來做SAX解析,并且把不能解析的部分留給下一次,與下次Push進來的XML一起做解析。然后自己根據tokenizer取出的token的信息來拼裝簡版的DOM(只有Element和Text,但是對XMPP已經夠用了,不夠再加)。最后的形式就是這邊提供一個Push方法,以及五個事件OnStreamBegin, OnStreamEnd, OnStanza, OnStreamError, OnParserError。
一開始的時候嘗試過完全自己來寫,發現那些代碼太丑了,還是用別人寫好了的比較好。無論如何,總算避免了完全手工的字符串比對,比Exodus那一套是強得多了。
浙公網安備 33010602011771號