`
fortaotao
  • 浏览: 47616 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

XMLPULL源码解读记录

    博客分类:
  • XMPP
 
阅读更多

XMPP协议的JAVA实现,采用XMLPULL协议是比较好的实现策略,下了源码,记录下,不定时更新。

 

一、核心处理流程:

1、pc策略(pc是MXParser类中定义的一个字符数组char[],个人理解翻译为Processed Character处理过的字符)

MXParser实现中通过Reader读到的字符会全部原封不动存储在buf这个字符数组中。在某次next()逻辑中,比如某tag中的文本数据解析过程中,存在CDATA数据或Reference数据时,需要将解析后的字符存储到pc这个字符数组中,如果这种数据在本次next()解析过程中出现多次,即在处理新的CDATA数据或Reference数据时,发现hadCharData为true,需要进行joinPC合并,并将needMerging置为false。pc在每次next()的起始处是被从头覆写的,pcStart和pcEnd会归0.

 

2、nextToken()

a、进行xml头解析parseProlog()

包括BOM、<?xml version='1.0' encoding='UTF-8' standalone='yes'?>和根元素的解析

b、循环进行根元素中的元素分析

b.1、遇到"<"字符,发现已经有字符数据,退出,返回TEXT事件;没有字符数据,则more()下一个字符进行分支判定,分支包括/(是否标签结尾)、!(是否注释!-或CDATA![)、?(PI解析,存在疑问)、合法元素起始字符(正常走parseStartTag()且return该方法返回事件,存在疑问)、其它字符抛异常。

b.1.1、/(是否标签结尾)

 

 

b.2、遇到"&"字符,发现已经有字符数据,退出,返回TEXT事件;没有字符数据,则进行reference解析

 

3、next()

与nextToken()流程基本相同,只是遇到特定字符时,不会中断返回附加事件,流程更简单,这也是只用讲解nextToken()实现逻辑的原因。

XmlPullParser里共定义了5类核心事件,即next()和nextToken()都会关注的事件:

int START_DOCUMENT = 0;

int END_DOCUMENT = 1;

int START_TAG = 2;

int END_TAG = 3;

int TEXT = 4;

6类附加事件,即仅nextToken()会关注的事件。

int CDSECT = 5;

int ENTITY_REF = 6;

int IGNORABLE_WHITESPACE = 7;

int PROCESSING_INSTRUCTION = 8;

int COMMENT = 9;

int DOCDECL = 10;

 

4、buf维护策略

a、每次通过Reader最多读取的内容块大小为READ_CHUNK_SIZE 8K。

b、JVM剩余内存超1000000,则buf定义为char[READ_CHUNK_SIZE],否则为char[256]。

c、设定了95%的容量使用限制,当buf填充超过这个限制,要进行压缩或扩容处理。

压缩就是把未处理的buf部分直接从buf0位进行覆盖;扩容就是直接两倍buf长度,并把未处理的buf部分直接从buf0位进行覆盖。

选择压缩还是扩容,取决于下面的因素:

*如果是xml声明部分处理过程中,禁止压缩(理由没想通)

*如果待分析的buf内容全部在超出限制部分,则适宜于压缩

*如果待分析的buf内容起始位置尚未达到buf的一半,且小于限制,则适宜于扩张

d、超出使用限制,进行扩容或压缩后,很多变量需要重新设值。

*bufStart归0,因为待解析buf内容现在都是从0开始。

*bufEnd也要随bufStart缩减bufStart长度值。

*pos也要随bufStart缩减bufStart长度值。

*posStart、posEnd同上。

*bufAbsoluteStart要准确记录这次缩减,从0调整为bufStart。后续如果再次调整,要再加bufStart。

分享到:
评论

相关推荐

    Xmlpull 源代码

    2. **状态机**:在XMLPull源码中,解析器内部通常使用一个状态机来跟踪解析过程。状态机在XML文档的不同部分之间切换,根据当前状态决定如何处理输入数据。 3. **解析器实例化**:在XMLPull源代码中,你需要创建...

    xmlPull源码

    XML Pull解析器在Android中的主要接口是`org.xmlpull.v1.XmlPullParser`和`org.xmlpull.v1.XmlPullParserFactory`。首先,我们需要通过`XmlPullParserFactory`创建一个`XmlPullParser`实例。工厂类提供了设置解析器...

    android xmlpull详细源代码

    本教程将深入探讨Android中的XMLPull解析,并通过具体的源代码分析来帮助理解其工作原理和使用方法。 首先,我们需要了解XMLPull的基本概念。XMLPull解析器是基于拉取(Pull)模式的,意味着开发者可以主动控制解析...

    xmlpull_1_0_5解决 org/xmlpull/v1/XmlPullParserException

    4. **处理异常**:在代码中捕获`XmlPullParserException`,并提供适当的错误处理逻辑,如记录日志或向用户显示友好的错误信息。 5. **检查输入流**:确保提供的输入流有效且包含有效的XML数据。如果是从网络或文件...

    xmlpull.jar工具包

    工具包包括了:xmlpull_1_1_3_4c.jar;xmlpull_1.1.3.1.jar等。可以解析xml,导入时请将xmlpull_1_1_3_4c.jar;xmlpull_1.1.3.1.jar都导入,不然会报错。

    XMLPullProject(XMLPull读取)

    这个项目通过源代码示例,展示了如何在实际应用中使用XMLPull API。 XMLPull解析器的工作原理是基于事件驱动的,它会逐个读取XML文档中的元素,并触发相应的事件,如开始元素、结束元素、文本节点等。这种方式比DOM...

    xmlpull-1.1.3.1.jar

    XMLPull是XML解析的一种轻量级、高效的方法,尤其适合于资源有限的环境,如Android移动平台。在Android开发中,XMLPull解析器被广泛使用,因为它不需要完整的DOM树(Document Object Model)来存储XML文档,而是通过...

    xmlPull的jar包.zip

    创建XMLPullParser对象,设置输入源,然后通过循环处理XML事件,如下所示: ```java XMLPullParserFactory factory = XMLPullParserFactory.newInstance(); XMLPullParser parser = factory.newPullParser(); ...

    XmlPull解析

    XmlPull解析是一种高效且轻量级的XML处理方式,它允许开发者通过事件驱动的模型来解析XML文档。这种解析方式不需要构建完整的XML文档对象模型(DOM),因此在内存使用和性能上都比DOM解析更优秀,尤其适用于资源有限...

    xmlpull(java新型xml解析技术)

    3. 配置解析器:设置输入源,如文件、流或字符串,通过`setInput()`方法完成。 4. 循环读取事件:通过`next()`方法获取XML文档的下一个事件,然后根据事件类型调用相应的事件处理方法,如`getName()`、`getText()`等...

    xmlpull-1.1.3.1.jar和xmlpull-1.1.3.1.jar

    XMLPull是处理XML的一种轻量级、高性能的解析方式,它提供了一种统一的接口来读取XML文档,无论底层实现是基于SAX(Simple API for XML)还是DOM(Document Object Model)。XMLPull API的设计目标是减少解析XML时的...

    xmlpull.zip

    在使用这两个库进行XML解析时,首先需要导入它们到项目中,然后创建XMLPullParser对象,设置输入源(如文件、流或字符串)。接着,通过迭代调用XMLPullParser的next()方法,根据返回的事件类型(如START_TAG、END_...

    xmlpull-1.1.3.1.jar和kxml2-2.3.0.jar

    2. 设置输入源:使用setInput()方法指定要解析的XML文档输入源,可以是字符串、流或其他形式。 3. 循环处理事件:通过while循环遍历XML事件,每次调用next()方法移动到下一个事件,根据getEventType()返回的事件...

    xmlpull_doc_src

    "xmlpull_doc_src"这个压缩包包含的是XMLPull的相关帮助文档和源代码,这对于开发者来说是非常有价值的资源。 XMLPull的工作原理基于事件驱动模型,它并不像DOM解析器那样将整个XML文档加载到内存中,而是逐个解析...

    对xml文件进行xmlpull解析jar包

    2. **获取XMLPullParser**: 使用XMLPullParserFactory的`newInstance()`方法创建XMLPullParser对象,然后调用`setInput()`方法设置XML输入源,可以是文件、流或其他XML输入。 3. **初始化解析**: 调用`getEventType...

    xmlpull-tests_1_0_5.jar

    这是xmlpull的测试版本,废了好长时间才找到的,如果想要下载更多版本,可以去xmlpull的官网山去下载,不嫌弃的话拿去用吧

    xml解析+kxml2+xmlpull

    6. **示例代码**: ```java try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); XmlPullParser parser = factory.newPullParser(); parser.set...

    java_pull解析器使用包kxml2_xmlpull

    java_pull解析器使用包kxml2_xmlpull,包括gson-2.8.2.jar;kxml2-2.3.0.jar;xmlpull_1_1_3_4c.jar;xmlpull-1.1.3.1,jar;xstream-1.4.10.jar

    复杂XmlPull解析Demo

    此外,为了提高代码的可读性和可维护性,通常会使用`switch`语句来根据事件类型执行不同的操作,这样可以让代码结构清晰,易于理解。 在实际应用中,XmlPull解析常用于读取配置文件、解析网络返回的XML数据等场景。...

Global site tag (gtag.js) - Google Analytics