Java 如何限制XPath的作用域

Java 如何限制XPath的作用域,java,android,xpath,xmlpullparser,Java,Android,Xpath,Xmlpullparser,我需要在Android上解析相对较大的XML文件 一些节点内部结构包含HTML标记,对于其他一些节点,我需要从不同的深度级别提取内容。因此,我计划不使用XmlPullParser,而是: 使用XPath查找适当的节点 使用“getElementsByTagName”查找适当的子节点 提取信息并将其保存在自定义数据对象中 我的问题是性能。我打开文件的方式如下: File file = new File(_path); FileInputStream is = n

我需要在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解析整个XML文件并将其放入DOM结构中

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

在其他情况下,我只需要获得几个节点,不希望用户等待我的程序执行冗余解析

Q1:如何在不完整解析XML文件的情况下获取XML文件的某些部分?

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

多谢各位


另外,在一个特定的例子中,XML文件代表FB2文件格式,如果您有任何特定的提示可以解决我的FB2文件解析问题,请免费填写以添加其他注释。

我对android可用的XML工具集知之甚少,只是知道它非常有限


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

我对android可用的XML工具集知之甚少,只知道它的有限性让人痛苦


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

听起来似乎没有简单的解决方案,我应该真正实现自己的XML解析器/扫描仪,如果我得到了需要跳过的节点,那么我只需快速绕过该节点的结束标记(正确处理“CDATA”块)…不,不要这样做!使用SAX流可能会很棘手,但如果您尝试编写自己的解析器,您会犯严重错误,人们会因此讨厌您。事实上,SAX流与XmlPullParser提供的内容相同。问题是,对于HTML内容的冗余节点(通常是XM的内容),我会获得太多事件L节点。我想避免在这样的标记上得到回调…凯,也许有办法避免在“无关紧要”的节点上得到回调?无论如何谢谢你的帮助!哦,事实上你写的你没有使用Android的XML的经验…你推荐的是字面上的XmlPullParser…我可能应该增强它…听起来像re不是一个简单的解决方案,我应该实现自己的XML解析器/扫描器,如果我得到了需要跳过的节点,那么我只需快速绕过该节点的结束标记(正确处理“CDATA”块)…不,不要这样做!使用SAX流可能会很棘手,但如果您尝试编写自己的解析器,您会犯严重错误,人们会因此讨厌您。事实上,SAX流与XmlPullParser提供的内容相同。问题是,对于HTML内容的冗余节点(通常是XM的内容),我会获得太多事件L节点。我想避免在这样的标记上得到回调…凯,也许有办法避免在“无关紧要”的节点上得到回调?无论如何谢谢你的帮助!哦,事实上你写的你没有使用Android的XML的经验…你推荐的是XmlPullParser…我可能应该增强它。。。