2

我正在XPath用来查询我XML-file目前有哪些关于100KB.

我正在迭代一个数组并查询列表中的每个值。

不幸的是,在调试器下单个查询大约需要 3-4 秒,而在禁用调试器的情况下会稍微少一些。

有什么想法为什么这么慢?我使用 aGalaxy S2进行测试。

这是我的代码:

XPath xpath = XPathFactory.newInstance().newXPath();
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
DocumentBuilder builder = builderFactory.newDocumentBuilder();

Document document = builder.parse(new File(file_on_internal_sd_url)));

int size = mPrefs.getInt("no_ids", 0);
for(int i=0;i<size;i++) {
    String id= mPrefs.getString("id_" + i, null);
    String expression = "/tag1/tag2[@id = '" + id+ "']";
    NodeList nodes = (NodeList) xpath.evaluate(expression, document, XPathConstants.NODESET);
    if(nodes.getLength()>0) {
        myElements.add((Element)nodes.item(0));
    }
}

更新

当我省略时XPathConstants.NODESET,评估很快就完成了,但我没有得到NodeList. 它返回一个空字符串而不是......

4

2 回答 2

2

感谢@nvrmnd,我尝试了一下,找到了一种更好的解析器:

VTD-XML

这是开发人员的一个例子

但是本教程要好得多...

希望这可以帮助任何像我一样沮丧的人......

于 2013-07-18T11:42:13.047 回答
1

XPath 本身在遍历大型 XML 文档时效率不高。我自己的经验是,在低端设备上从大约 200kb 的 XML 文件中解析值大约需要 10 秒。

之后,我将解析器重新实现为 SAXParser,性能大幅提升了大约 2 个数量级。所以我建议你试试 SAXParser。实际上实现起来并不难,并且有几个教程。

在 stackoverflow 上也存在一个问题,涉及各种解析方法的主题:SAX vs. DOM vs. XPath

我还假设当您不使用 NodeSet 时评估会立即完成,因为它只会查找单个节点并在找到匹配节点后立即返回。

编辑:

用 SAX 解析 XML 文档意味着您遍历它并将寻找的信息存储在对象中。看看这个教程:SAX 教程

作者在那里解析人员信息并将其转换为对象,所以我想这正是您所需要的。

于 2013-07-17T16:24:21.847 回答