a、解析过程中遇到</字符,进入endTag解析。
b、代码详解
public int parseEndTag() throws XmlPullParserException, IOException { //ASSUMPTION ch is past "</" // [42] ETag ::= '</' Name S? '>' //紧接在</后面的字符需要检查是否符合isNameStartChar()条件 char ch = more(); if(!isNameStartChar(ch)) { throw new XmlPullParserException( "expected name start and not "+printable(ch), this, null); } //类似parseStartTag,将posStart置于<字符 posStart = pos - 3; final int nameStart = pos - 1 + bufAbsoluteStart; do { ch = more(); } while(isNameChar(ch)); // now we go one level down -- do checks //--depth; //FIXME // check that end tag name is the same as start tag //String name = new String(buf, nameStart - bufAbsoluteStart, // (pos - 1) - (nameStart - bufAbsoluteStart)); //int last = pos - 1; int off = nameStart - bufAbsoluteStart; //final int len = last - off; final int len = (pos - 1) - off; final char[] cbuf = elRawName[depth]; //如果与startTag的元素名称长度不一致,抛异常 if(elRawNameEnd[depth] != len) { // construct strings for exception final String startname = new String(cbuf, 0, elRawNameEnd[depth]); final String endname = new String(buf, off, len); throw new XmlPullParserException( "end tag name </"+endname+"> must match start tag name <"+startname+">" +" from line "+elRawNameLine[depth], this, null); } //如果与startTag的元素名称不完全相同,抛异常 for (int i = 0; i < len; i++) { if(buf[off++] != cbuf[i]) { // construct strings for exception final String startname = new String(cbuf, 0, len); final String endname = new String(buf, off - i - 1, len); throw new XmlPullParserException( "end tag name </"+endname+"> must be the same as start tag <"+startname+">" +" from line "+elRawNameLine[depth], this, null); } } //忽略元素名称结尾部分空字符 while(isS(ch)) { ch = more(); } // skip additional white spaces //没有>紧随则抛出异常 if(ch != '>') { throw new XmlPullParserException( "expected > to finish end tag not "+printable(ch) +" from line "+elRawNameLine[depth], this, null); } //namespaceEnd = elNamespaceCount[ depth ]; //FIXME posEnd = pos; pastEndTag = true; return eventType = END_TAG; }
c、代码要点
c.1、第一个字符必须符合isNameStartChar()条件。xml规范中大多有这个要求,名称后面出现空格等空白字符是允许的。
c.2、解析元素名称,检查与startTag对应元素名称是否一致。
c.3、紧接元素名称后,是否有>字符收尾。
c.4、返回END_TAG事件。
相关推荐
XML Pull解析器在Android中的主要接口是`org.xmlpull.v1.XmlPullParser`和`org.xmlpull.v1.XmlPullParserFactory`。首先,我们需要通过`XmlPullParserFactory`创建一个`XmlPullParser`实例。工厂类提供了设置解析器...
2. **状态机**:在XMLPull源码中,解析器内部通常使用一个状态机来跟踪解析过程。状态机在XML文档的不同部分之间切换,根据当前状态决定如何处理输入数据。 3. **解析器实例化**:在XMLPull源代码中,你需要创建...
XMLPull是XML解析的一种轻量级、高效的方法,尤其适合于资源有限的环境,如Android移动平台。在Android开发中,XMLPull解析器被广泛使用,因为它不需要完整的DOM树(Document Object Model)来存储XML文档,而是通过...
4. **处理异常**:在代码中捕获`XmlPullParserException`,并提供适当的错误处理逻辑,如记录日志或向用户显示友好的错误信息。 5. **检查输入流**:确保提供的输入流有效且包含有效的XML数据。如果是从网络或文件...
工具包包括了: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都导入,不然会报错。
总的来说,XMLPull是Java中处理XML的一种高效方法,特别适合于移动设备或者内存受限的环境。通过事件驱动的模型,它可以有效地降低内存占用,提高解析速度,是XML解析领域的一个重要选择。在实际开发中,掌握XMLPull...
使用XMLPull时,开发者首先创建一个XMLPullParser对象,然后调用其方法移动到下一个事件,如`next()`或`nextToken()`。根据返回的事件类型,比如START_TAG、END_TAG、TEXT等,执行相应的操作。这种方法使得解析器只...
XMLPull是一种轻量级的解析XML文档的方法,它允许开发者在没有额外依赖库的情况下高效地处理XML数据。这个项目通过源代码示例,展示了如何在实际应用中使用XMLPull API。 XMLPull解析器的工作原理是基于事件驱动的...
本教程将深入探讨Android中的XMLPull解析,并通过具体的源代码分析来帮助理解其工作原理和使用方法。 首先,我们需要了解XMLPull的基本概念。XMLPull解析器是基于拉取(Pull)模式的,意味着开发者可以主动控制解析...
XmlPull解析是一种高效且轻量级的XML处理方式,它允许开发者通过事件驱动的模型来解析XML文档。这种解析方式不需要构建完整的XML文档对象模型(DOM),因此在内存使用和性能上都比DOM解析更优秀,尤其适用于资源有限...
XMLPULL解析是一种轻量级、高效的处理XML文档的方法,尤其适用于资源有限的移动设备或嵌入式系统。它提供了一种编程接口,允许开发者在Java环境中读取和解析XML文档,而无需依赖完整的DOM(Document Object Model)...
接着,通过迭代调用XMLPullParser的next()方法,根据返回的事件类型(如START_TAG、END_TAG等)来读取和处理XML元素。对于微信支付的个人零钱支付,可能需要解析的XML数据可能包括交易ID、支付状态、金额、时间戳等...
XMLPull是处理XML的一种轻量级、高性能的解析方式,它提供了一种统一的接口来读取XML文档,无论底层实现是基于SAX(Simple API for XML)还是DOM(Document Object Model)。XMLPull API的设计目标是减少解析XML时的...
在处理XML文件时,有多种解析方式,其中XMLPull解析是一种轻量级、高效的解析方法,适用于资源有限的环境,如移动设备。XMLPull解析器允许应用程序以拉取(pull)的方式逐个读取XML元素,而不是等待整个文档加载完毕...
这是xmlpull的测试版本,废了好长时间才找到的,如果想要下载更多版本,可以去xmlpull的官网山去下载,不嫌弃的话拿去用吧
在Android开发中,XML解析是处理XML文档不可或缺的技术,主要包括DOM(Document Object Model)、SAX(Simple API for XML)、PULL(Pull Parser)以及KXML2等方法。这里我们将详细探讨“xml解析+kxml2+xmlpull”...
你可以看到如何实现XMLPull解析器的核心类,如`XMLPullParser`,它是处理XML文档的主要接口,提供了诸如next()、getName()、getText()等方法来获取XML文档的结构和内容。 "xmlpull_doc"目录则包含了XMLPull的文档...
例如,当遇到START_TAG时,我们可以记录元素名称,或者开始处理子元素;遇到TEXT时,我们可以获取元素的文本内容;遇到END_TAG时,表示当前元素结束,可能需要进行关闭操作。 3. 结束处理:当`next()`返回END_...
XMLPull API的核心是XMLPullParser类,它定义了一组方法,如`next()`、`getName()`和`getText()`,使得开发者可以控制解析过程并获取当前解析位置的信息。 结合KXML2和XMLPull,开发者可以在Android应用中实现灵活...