如何限制XPath的范围

时间:2013-10-03 22:24:52

标签: java android xpath xmlpullparser

我需要在Android上解析相对较大的XML文件。

某些节点内部结构包含HTML标记,对于某些其他节点,我需要从不同的深度级别提取内容。因此,我不打算使用XmlPullParser,而是计划:

  • 使用XPath,找到合适的节点
  • 使用'getElementsByTagName'找到合适的子节点
  • 提取信息并将其保存在我的自定义数据对象中。

我遇到的问题是表现。我打开文件的方式如下:

        File file = new File(_path);
        FileInputStream is = new FileInputStream(file);

        XPath xPath = XPathFactory.newInstance().newXPath();
        NamespaceContext context = new NamespaceContextMap("def", __URL__);
        xPath.setNamespaceContext(context);

        Object objs = xPath.evaluate("/def:ROOT_ELEMENT/*,
            new InputSource(is), XPathConstants.NODESET);

即使我需要获取XML文件最开头的一些字符串,看起来XPath会解析WHOLE xml文件并将其放在DOM结构中。

在某些情况下,我需要访问完整的对象,并且几兆字节的文件可以运行几秒钟。

在其他情况下 - 我只需要获得少量节点,并且不希望用户等待我的程序执行冗余解析。

Q1:获取XML文件的某些部分而不解析它的方法是什么?

Q2:有没有办法限制XPath扫描/解析整个XML文件?例如:扫描到第二级深度?

谢谢。

P.S。在一个特定情况下,XML文件代表FB2文件格式,如果您有任何特定提示可以解决我的fb2文件解析问题,请填写免费添加其他注释。

1 个答案:

答案 0 :(得分:1)

我不太了解可用于Android的XML工具集,除非知道它受到限制!

解决此要求的最佳方法可能是编写流式SAX过滤器,查找您感兴趣的文档部分,并构建仅包含那些部分的DOM,然后您可以使用XPath进行查询。我有点不愿意这样说,因为如果你之前没有做过这样的事情并不容易,但这似乎是正确的做法。