Java SAX模型是否有XPath处理器?

Java SAX模型是否有XPath处理器?,java,xml,xpath,sax,Java,Xml,Xpath,Sax,我正在寻找一个XPath计算器,它不会重建整个DOM文档来查找文档的节点:实际上,它的目标是使用SAX模型管理大量XML数据(理想情况下超过2Gb),这非常适合内存管理,并提供搜索节点的可能性 谢谢大家的支持 对于所有那些说这不可能的人:我最近在问了这个问题后发现了一个名为“saxpath”()的项目,但我找不到任何实现项目。嗯,我不知道我是否真的理解你。据我所知,SAX模型是面向事件的。这意味着,如果在解析过程中遇到某个节点,您可以执行某些操作。是的,它对内存更好,但我不知道您希望如何将XPa

我正在寻找一个XPath计算器,它不会重建整个DOM文档来查找文档的节点:实际上,它的目标是使用SAX模型管理大量XML数据(理想情况下超过2Gb),这非常适合内存管理,并提供搜索节点的可能性

谢谢大家的支持


对于所有那些说这不可能的人:我最近在问了这个问题后发现了一个名为“saxpath”()的项目,但我找不到任何实现项目。

嗯,我不知道我是否真的理解你。据我所知,SAX模型是面向事件的。这意味着,如果在解析过程中遇到某个节点,您可以执行某些操作。是的,它对内存更好,但我不知道您希望如何将XPath引入其中。由于SAX不构建模型,我认为这是不可能的。

我认为xpath不适合SAX,但您可以看看StAX,它是一种用于Java的扩展流式XML API


您可以做的是将XSL转换器挂接到SAX输入源。您的处理将是连续的,XSL预处理器将尝试捕获输入,并将其处理为您指定的任何结果。您可以使用它从流中提取路径的值。如果您希望在一次过程中生成一组不同的XPATH结果,那么这将特别有用


结果是(通常)得到一个XML文档,但您可以从(比如)一个
StreamResult
中提取预期的输出,而不需要太多麻烦。

标准的javax xpath API在技术上已经可以用于流
javax.xml.xpath.XPathExpression
可以根据
InputSource
进行评估,而InputSource又可以使用
读取器构建。我不认为它是在幕后构造DOM。

SAX只是向前的,而XPath查询可以在任何方向上导航文档(考虑
父项:
祖先:
前面:
前面的同级:
轴)。总的来说,我不认为这是可能的。最好的近似方法是某种延迟加载DOM,但根据您的查询,这可能会给您带来任何好处,也可能不会给您带来任何好处-总是存在最坏的查询,例如
/*[.!=preference::*]

有基于SAX/StAX的XPath实现,但它们只支持XPath表达式/axis的一小部分,这主要是由于SAX/StAX的只向前的特性。。我所知道的最好的替代方法是扩展,它支持完整的xpath,通过mem映射部分加载文档。。最大文档大小为256GB,但您需要64位JVM才能充分利用它的潜力

看看Saxon SA XSLT处理器的流模式

“确定路径表达式是否可以流式传输的规则包括:

  • 要流式处理的表达式以调用document()或doc()函数开始
  • 调用doc()或document引入的路径表达式必须符合XPath的子集,定义如下:

  • 如果任何XPath表达式符合XML架构中标识约束中出现的路径表达式的规则,则可以接受该表达式。这些规则不允许使用谓词;第一步(但仅第一步)可以使用“//"; 最后一步可以选择使用属性轴;所有其他步骤必须是使用子轴的简单轴步骤

  • 此外,Saxon允许表达式包含并集,例如doc()/(*/ABC |/XYZ)。联合也可以用缩写形式表示,例如,上面可以写成doc()/(ABC | XYZ)
  • 表达式必须仅选择元素,或仅选择属性,或选择元素和属性的混合

  • 还支持简单过滤器(一个或多个)。每个筛选器都可以应用于最后一步或整个表达式,并且只能使用上下文节点(self、child、attribute、substant、substant或self或命名空间轴)中的向下选择。它不能是位置的(也就是说,它不能引用position()或last(),也不能是数字的:事实上,它必须是这样的:Saxon可以在编译时确定它不是数字的)。筛选器不能应用于联合或联合的分支。任何违反这些条件的行为都会导致在不进行流优化的情况下计算表达式

  • 这些规则在对表达式应用其他优化重写后适用。例如,一些FLWOR表达式可以重写为满足这些规则的路径表达式

  • 只有通过使用saxon:stream()扩展函数、anXSLT xsl:copy of指令上的saxon:read once属性或XQuery pragma saxon:stream明确请求时,才会启用优化。仅当使用Saxon SA处理样式表或查询时,此选项才可用。”


注意:很可能在商业版本中,这个功能是可用的。我之前已经广泛使用了Saxon,这是一个很好的工作。

对不起,这里的回答稍微晚了一点-似乎这对于XPath的子集是可能的-一般来说,这非常困难,因为XPath可以前后匹配我知道有两个项目在某种程度上使用状态机解决了这个问题:&。我没有详细介绍它们,但它们似乎使用了类似的方法。

XPath确实适用于SAX和大多数XSLT处理器(特别是Saxon和Apache Xalan)确实支持在SAX流上的XSLT中执行XPath表达式,而无需构建整个dom

他们大致做到了以下几点:

  • 检查需要匹配的XPath表达式
  • 接收SAX事件并测试某个XPath表达式是否需要或将需要该节点
  • 忽略SAX事件,如果
    <doc>
    <nodes>
      <node name="a">text of node 1</node>
      <node name="b">text of node 2</node>
      <node otherattr="I have attributes!">text of node 3</node>
    </nodes>
    </doc>
    
    @XPath("/nodes/node")
    void onNode(String nodeText)
    {
      // will be called with "text of node [123]"
    }
    
    @XPathStart("//node[@name='']")
    void onNode3(Attrs node3Attrs) { ... }
    
    @XPathEnd("/nodes/node[2]")
    void iDontCareAboutNode3() throws SAXExpression
    {
      throw new StopParsingExpression();
    }