【问题标题】:Stax parsing - parse children nodes depending on selected parentStax 解析 - 根据选定的父节点解析子节点
【发布时间】:2012-10-17 21:28:12
【问题描述】:

我需要在服务器上解析一个巨大的 xml 文件并将其发送给客户端。
我想按需进行解析 - 意思是,首先只解析和显示父节点,当客户端点击父节点时 - 向服务器发送一个请求,告诉服务器选择了哪个父节点,然后解析并发送它的孩子(同样,不是整个子树,而只是父母)。
我考虑过使用 STAX 解析器,但在涉及父子关系时我不明白如何使用它。如何告诉解析器不要继续到下一个 START-ELEMENT 子元素,而是跳到其级别的下一个父元素?还有 - 有没有办法回到 ITERATOR 实现?选择一个父母并看到它的孩子后,我可以回去看看以前的父母吗?
我真的很感激任何建议!
谢谢。

【问题讨论】:

  • 我需要完全类似才能获得一些parrent的分支。但是这可以通过 Dom 解析器来完成

标签: java xml xml-parsing stax


【解决方案1】:
  1. 不,您不能跳过 XML 文档的子树而不先对其进行解析。对于每个解析器都是如此,而不仅仅是 StAX。 (知道要跳到哪个点意味着您已经解析了中间的元素。)

  2. 但是,通过维护一个嵌套级别计数器,该计数器随每个开始元素事件递增并随每个结束元素事件递减,很容易忽略来自低于目标级别的所有事件。

  3. 解析是一种方式,不是随机访问,不能来回跳转。 (同样,这将假定解析器存储到目前为止已解析的所有内容的表示,这正是创建 StAX 来避免的。)当然,您可以尝试记录文件中每个父标记的字节位置,然后稍后如果您已打开文件以进行随机访问,请寻求它。不过,这种方法有很多缺陷。

总而言之,您的用例看起来不太适合 StAX。你试过VTD-XML吗?根据您的文件有多大,它可能正是您想要的。

【讨论】:

  • 感谢您的详细解答!不过我有几个问题:1)我可以在不解析子树的情况下搜索下一个父级(兄弟姐妹),而只是阅读它 - 不进行完整解析吗?还是遍历子树=解析它? 2)我不确定我是否需要随机访问。我想每次都显示一个特定的级别。单击节点时 - 显示其第一级子级。这里需要随机访问吗?我需要 X-Path 吗?如果我这样做 - 我可以将它与 STAX 结合起来吗?还是我最好寻找其他解析器? 3) VTD-XML 对 1GB 的文件有用吗?因为这就是我所拥有的......
  • 1.是的,我考虑过一个子树作为解析。当然你不需要记录关于这些节点的任何东西(除了我提到的深度计数器,它是一个全局的int)。 2. 这实际上是随机访问,因为每次用户点击一个节点时,您都​​必须从不同的位置开始处理。 3. 据我所知,是的。但我没有参与那个项​​目,我也从未尝试在这么大的文件上使用它。
  • 谢谢!最后一个问题(我希望......):我想知道我是否理解得很好:在 Stax 中 - 每次单击节点时都会花费大量时间来解析所有数据,但另一方面它不会t 使用大量内存(它不保存任何数据?这意味着我解析一个小文件还是一个大文件都没有关系?)。在 VTD-XML 上 - 它使用大量内存(至少在我的情况下它很多) - 但是只有在单击第一个节点时它才会很慢(当它第一次也是唯一一次进行解析时?) -然后会很快。正确的?再次感谢,你真的帮助了我!
  • 是的,没错。我认为最好的办法是为这两种解决方案编写一个简短的测试,然后自己看看需要多长时间。谁知道呢,其中一个或两个甚至可能比您预期的要快得多。
猜你喜欢
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多