Stax解析 - 根据所选父节点解析子节点

5
我需要在服务器上解析一个巨大的xml文件并将其发送给客户端。
我想按需解析 - 这意味着,只有在最初解析和显示父节点时,当客户端点击父节点时,才向服务器发送一个请求,告诉它选择了哪个父节点,然后再解析和发送其子节点(仅限父节点)。
我考虑使用STAX解析器,但我不知道如何处理父子关系。如何告诉解析器不要继续到下一个START-ELEMENT,而是跳过到其级别中的下一个父节点?还有 - 是否有一种方法可以使用ITERATOR实现回退?在选择一个父节点并查看其子节点之后,我可以返回并查看以前的父节点吗?
非常感谢任何建议!
谢谢。

我需要的是获取某个父级分支的精确副本,然而这可以通过Dom解析器完成。 - To Kra
1个回答

3
  1. 不能跳过XML文档中的子树而不解析它,这对于每个解析器都是正确的,不仅仅是StAX。(“知道”要跳过哪个点意味着您已经解析了中间的元素。)

  2. 但是,通过维护嵌套级别计数器,您可以在每个启动元素事件时增加计数器,在每个结束元素事件时递减计数器,从而轻松忽略所有来自目标级别以下级别的事件。

  3. 解析是单向的,不是随机访问,您无法来回跳转。(同样,这会假设解析器存储了到目前为止解析的所有内容的表示形式,这正是创建StAX的目的所在。)但是,当然,您可以尝试记录文件中每个父标记的字节位置,然后如果您打开文件进行随机访问,稍后寻找到它。但是,这种方法存在相当多的陷阱。

总的来说,您的用例似乎不适合使用StAX。您尝试过VTD-XML吗?根据您的文件大小,它可能正是您想要的。


感谢您详细的回答!我有几个问题:1)我能否在不解析子树的情况下搜索下一个父节点(兄弟节点),而只是读取它 - 而不是进行完整的解析?或者遍历子树=解析它?2)我不确定是否需要随机访问。我想每次显示特定级别。单击节点时,显示其第一级子项。这里需要随机访问吗?我需要使用X-Path吗?如果需要,我可以将其与STAX结合使用吗?还是我最好寻找其他解析器?3)对于1GB的文件,VTD-XML是否适用? - user1579191
  1. 是的,我考虑过将子树遍历作为解析。当然,你不需要记录这些节点的任何信息(除了我提到的深度计数器之外,它是一个单一的全局 int)。
  2. 这实际上是随机访问,因为每次用户点击一个节点时,你都必须从不同的位置开始处理。
  3. 就我所知,是的。但我没有参与那个项目,也从未尝试在如此大的文件上使用它。
- biziclop
谢谢!最后一个问题(我希望是这样的...):我想知道我是否理解正确:在 Stax 中 - 每次单击节点时解析所有数据需要很长时间,但另一方面它不使用太多内存(它不保存任何数据?这意味着无论我解析小文件还是大文件都没有关系?)。在 VTD-XML 中 - 它使用了很多内存(至少在我的情况下是很多)- 但然后只有在单击第一个节点时才会变慢(当它进行第一次和唯一一次解析时?)- 然后将会变得相当快。对吗?再次感谢,你真的帮了我! - user1579191
是的,这是正确的。我认为最好的做法是为两种方案编写一个简短的测试,并自行查看需要多长时间。谁知道呢,其中一种或两种解决方案甚至可能比您预期的要快得多。 - biziclop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接