如何使XmlPullParser返回顶级元素列表?

时间:2011-08-02 20:25:50

标签: java android xml android-xml

我一直在使用XmlPullParser从本地存储的xml文档在Android应用程序上生成表单。

XmlPullParser xpp = getResources().getXml(R.xml.calculator);
int eventType = xpp.getEventType();

然后我有了一个while循环来处理树中的所有元素。但是,因为我一直在使用

eventType = xpp.next(); 

这是一个深度优先的方法,实际上我想要一个广度优先的处理方法(用户通过提问来钻取树)。大多数xml教程都依赖于DOM,因为内存限制,我听说它在android上是不可靠的。我非常感谢你的帮助。

xml采用这种形式

<top>
    <page>
    <question>This is the first question</question>
    <answer>
         <text>Answer 1</text>
         <page>
              <question>If you choose Answer 1 you get asked this question</question>
              <answer>
              .
              .
              </answer>
              <answer>
              .
              .
               </answer>
         </page>
    </answer>

    <answer>
         <text>Answer 2</text>
         .
         .
         .
    </answer>

    </page>
</top>

我希望这比以前更有意义。所以实际上,在给定这棵树的情况下,我想生成屏幕(在运行时),询问用户这些问题并将他们的答案带入。根据他们的答案,他们会得到下一组问题。感谢您的快速回复!!

3 个答案:

答案 0 :(得分:1)

如果你想获得顶级元素(文档根元素中的元素),那么我建议保留当前元素的Stack。点击开始时,将元素名称推送到堆栈。当你停止时,从堆栈中弹出元素名称。每当你在堆栈上有一个元素时,你就拥有了一个顶级元素。

答案 1 :(得分:0)

如果您不想使用DOM,那么您将需要从深度优先的角度构建自己的XML文档对象模型。在构建模型之后,您可以应用广度优先语义。

如果您担心内存,那么没有任何内容表明您的对象模型必须在内存中...您可以在解析它时将其存储在SQLLite数据库中。这可以帮助您避免多次解析XML并更好地与您的应用程序集成。

没有任何其他细节,这就是我可以告诉你的全部内容。

答案 2 :(得分:0)

在我看来,breadfirst算法在获取第一级节点时会更直观。然而,这似乎是一种非常“人性化”的方法。我想不出一种xml解析器在读取开始标记时可以猜出第一级标记结束的方式。

所以,无论如何,你的解析器必须读取整个文件,堆叠所有节点。也许可以避免堆叠,但与实际调整xml结构本身相比,它看起来像花生。所以收益不会很大。

您是否考虑使用数据库和两个具有一对多关系的表? 它既可以解决您的应用程序能够处理的效率和数据量。

此致  斯特凡