How/when 使用 XmlPullParser.require() 方法

How/when to use XmlPullParser.require() method

Android新手免责声明:我是Android新手,请放轻松。

我正在努力理解 Android's Parsing XML Data 示例,特别是他们对 parser.require() 的用法 - 在 "Read the Feed".

标题下

是的,我读过 the documentation for XmlPullParser。我一定是个白痴,因为我无法理解它。

我也在这些 SO 论坛上搜索过,但没有成功找到我可以亲自解析的答案:-)

好的,所以如果不满足传入的参数,它会抛出异常。当它似乎只应用于单个元素时,它对我有何帮助?

我怎么知道要将哪些参数传递给方法?

总是有必要吗?还是只是偶尔?为什么?

我是否应该在解析 XML 时使用此方法?在哪里?为什么?

他们的示例似乎在 XML 提要的开头处理 "feed" 标记,但他们似乎没有处理紧随其后的 "title" 标记。为什么他们会断言 "feed" 标签而不是下面的 "title" 标签?

我的天啊,我很困惑。

我对为 Android 开发的挫败感越来越大,这个小问题即将让我崩溃。如果有人能简单地向我解释为什么使用 .require() 方法,以及在适当的时候,我将永远感激不已。

我在这里 post 没有自己的示例代码,因为我所做的只是阅读并试图理解示例代码。

提前感谢所有试图帮助我的人。

在 post 提出这个问题后,我想我明白了 .require() 是如何工作的。从 developers.android.com 中获取以下代码片段:

parser.require(XmlPullParser.START_TAG, ns, "feed");
while (parser.next() != XmlPullParser.END_TAG) {
    if (parser.getEventType() != XmlPullParser.START_TAG) {
        continue;
    }
    String name = parser.getName();
    // Starts by looking for the entry tag
    if (name.equals("entry")) {
        entries.add(readEntry(parser));
    } else {
        skip(parser);
    }
}

...我要从这里拿走的是,通过使用 .require() 我们将光标设置到 "feed" 元素的 START_TAG - 顶级元素- 然后我们可以进入一个循环,直到我们最终命中我们最初排队的提要元素的 END_TAG

因此,.require() 不仅验证 xml 元素的入口点,而且还通知解析器您正在输入哪个元素,以便您可以遍历它直到您点击结束该特定元素的标签。

比我认为的更容易理解 - 对于最初的抱怨 post!

根据 Android's documentationparser.require() 方法使用此签名:

require(int type, String namespace, String name)

...将解析器排队到指定的元素 (name),在声明的命名空间 (namespace) 中,在您指定的事件类型 (type)。这是一个简单的 XML 片段,可帮助您形象化:

<foo>Hello World!</foo>

parser.require( XmlPullParser.START_TAG, ns, "foo" ) 最初会将您的光标排队到 foo 元素的开始标记:<foo>

parser.require( XmlPullParser.TEXT, ns, "foo" ) 最初会将光标排到 foo 元素内的文本:"Hello World!"

parser.require( XmlPullParser.END_TAG, ns, "foo" ) 最初会将您的光标排队到 foo 元素的结束标记:</foo>

无论您将光标放在 parser.require() 文档中的哪个位置,您都可以根据需要使用 parser.next() 遍历文档。

在迭代时,您可以检查每个 "event" 以确定它是什么类型:START_TAGTEXTEND_TAGEND_DOCUMENT .然后,您的逻辑可以根据您的需要处理每个事件及其值。