我一直在使用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>
我希望这比以前更有意义。所以实际上,在给定这棵树的情况下,我想生成屏幕(在运行时),询问用户这些问题并将他们的答案带入。根据他们的答案,他们会得到下一组问题。感谢您的快速回复!!
答案 0 :(得分:1)
如果你想获得顶级元素(文档根元素中的元素),那么我建议保留当前元素的Stack
。点击开始时,将元素名称推送到堆栈。当你停止时,从堆栈中弹出元素名称。每当你在堆栈上有一个元素时,你就拥有了一个顶级元素。
答案 1 :(得分:0)
如果您不想使用DOM,那么您将需要从深度优先的角度构建自己的XML文档对象模型。在构建模型之后,您可以应用广度优先语义。
如果您担心内存,那么没有任何内容表明您的对象模型必须在内存中...您可以在解析它时将其存储在SQLLite数据库中。这可以帮助您避免多次解析XML并更好地与您的应用程序集成。
没有任何其他细节,这就是我可以告诉你的全部内容。
答案 2 :(得分:0)
在我看来,breadfirst算法在获取第一级节点时会更直观。然而,这似乎是一种非常“人性化”的方法。我想不出一种xml解析器在读取开始标记时可以猜出第一级标记结束的方式。
所以,无论如何,你的解析器必须读取整个文件,堆叠所有节点。也许可以避免堆叠,但与实际调整xml结构本身相比,它看起来像花生。所以收益不会很大。
您是否考虑使用数据库和两个具有一对多关系的表? 它既可以解决您的应用程序能够处理的效率和数据量。
此致 斯特凡