【问题标题】:Can SAX Parsers use XPath in Java?SAX 解析器可以在 Java 中使用 XPath 吗?
【发布时间】:2012-02-06 04:12:48
【问题描述】:

我正在尝试将我的一个使用DOM 解析和大量XPath 表达式的类迁移到SAX 解析。 DOM 解析对我来说很好,但是我尝试解析的一些文件太大了,它们会导致服务器超时。我想通过SAX 解析重用XPath,但我不确定这是否可能,如果不可能,请您帮助我,因为我不知道当我只使用@987654328 时以下代码将如何@:

Document doc = bpsXml.getDocument();
String supplierName = BPSXMLUtils.getXpathString(doc, "/Invoice/InvoiceHeader/Party[@stdValue='SU']/Name/Name1");
String language = BPSXMLUtils.getXpathString(doc, "/Invoice/InvoiceHeader/InvoiceLanguage/@stdValue");

【问题讨论】:

  • 等等,你为什么要从带有 XPath 的 DOM 切换到 SAX?如果是因为您从 Web 获取文件而服务器发送文件的时间过长,请更改获取文件的方式,而不是解析文件的方式。
  • 还有这个related SO post。一些答案提到了可用于此目的的工具和 API。

标签: java xml dom xpath sax


【解决方案1】:

仅使用 SAX 解析器不会在内存中构建 XML 树的表示(这就是 SAX 更节省内存的原因)。它只会在遇到新的 XML 元素时触发“事件”。您必须将上下文(通常是一堆父元素)保存在内存中,以“知道”您在树中的位置。

由于内存中没有树,因此无法使用 XPath。您只能测试当前的“上下文”(您的手动管理堆栈)来查询您的文档。请记住,SAX 解析器只会对您的文件执行一次运行,因此文件中的顺序很重要。

幸运的是,还有其他方法,例如VTD-XML,这是一个在内存中构建 XML 树的库,但只是结构部分,它不会从文件中提取实际内容,根据需要提取内容。它比 DOM 解析器的内存效率高得多,同时仍然允许 XPath。我个人在工作中使用这个库来解析大约 700MB 的 XPath XML 文件(是的,这很疯狂,但它可以工作而且速度非常快。)

【讨论】:

  • 这是一个非常好的主意,但是当您拥有由大量 XML 元素和短数据组成的大文件 (2+ GB) 时,它就不能很好地工作。在实践中,您会减少 50/60 % 的所需内存。这很好,但当您有非常大的文件时还不够。而如今数据的增长速度越来越快……
  • 这些年来,我确实使用 VTD-XML 解析了 2GB+ 的文件。它做得很好,内存根本不是问题。您是否尝试过并且体验不佳?你能分享更多信息吗?
  • 你为解析程序分配了多少内存(-Xmx)?
  • 我的大部分解析都使用默认的 Xmx (64 MB),但有时为了安全起见,我不得不将其推高到 1GB(从内存中,我不再处理这些主题)。
【解决方案2】:

恕我直言,处理 XML 的最简单方法是使用 StAX,即 XML 的 Streaming API。它结合了 DOM 和 SAX 的优点(并为您提供了更轻松的迁移)。您仍然拥有指向 XML 元素的光标(如在 SAX 中),但您的代码将光标向前移动。这带来了极大的优势,即 XML 处理代码变得更具可读性。它还解决了内存问题,因为只有当前的 XML 元素必须保存在内存中。这也是一个不错的tutorial

还要回答您最初的问题:在 Google 上进行的简短搜索向我表明,没有简单、被广泛接受的方法,这可能意味着所有自定义解决方案都不可靠、未维护且未经过良好测试。

【讨论】:

    【解决方案3】:

    切换到 SAX 解析(或 StAX)需要彻底改变您的方法。看起来你好像还没有完全意识到它会做多少工作。为了使任何建议有意义,我们需要知道文件有多大,以及您想对数据进行什么样的处理。例如,如果您正在过滤数据,那么使用文档投影的 XQuery 实现可能是一个很好的答案(这将在幕后自动使用 SAX 来构建一个仅包含您实际感兴趣的数据子集的树) .

    【讨论】:

      猜你喜欢
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      相关资源
      最近更新 更多