唉,这也是迫于无奈。当初看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那一套是强得多了。