Java 展平xml文件

Java 展平xml文件,java,xml,xslt,xml-parsing,Java,Xml,Xslt,Xml Parsing,我想编写一个通用的xml解析器,它可以展平任何xml文件。e、 g 如果xml具有如下结构: <A a="a1"> <B> b </B> <C> <D> d1 </D> <D> d2 </D> </C> <C> <D> d3 </D> </C> <

我想编写一个通用的xml解析器,它可以展平任何xml文件。e、 g

如果xml具有如下结构:

<A a="a1">

   <B> b </B>

   <C>

      <D> d1 </D>

      <D> d2 </D>

   </C>

   <C>

      <D> d3 </D>

   </C>

   <E> e1 </E>     

</A>

B
d1
d2
d3
e1
我应该得到如下输出:

a1 b d1 e1

a1 b d2 e1

a1 b d3 e1

我希望解析器是通用的,这样就可以在不知道标记的情况下应用于任何xml。我听说过XSLT。但是我不确定我们是否可以编写一个通用的XSL,而不需要了解xml标记。XML文件的大小可以是~1Gb。
这个问题有一个通用的解决方案吗?

使用SAX解析器,并保留一堆打开的元素。看到元素打开后,将它们添加到堆栈中。在文本节点上,打印堆栈,在关闭元素时,将其从堆栈中弹出。应该是直截了当的。

你似乎想要的“扁平化”更像是“爆炸”。您的输入是一棵树,您希望将其分解为一组记录,并重复所有冗余数据。这不是XSLT的工作。从概念上讲,您必须对数据进行多次传递。首先,必须标识所有级别的所有叶节点集合;然后,您必须运行所有可能的叶节点组合,为每个组合输出一组完整的数据。如果您的输入容量约为1GB,请为TB的输出做好准备

看起来您有两个选择:

  • 使用SAX将整个树加载到内存中,然后实现爆炸算法
  • 传递输入数据以提取结构并在每个叶节点集上建立位置游标;然后对输入进行多次传递,使用光标决定每次传递的输出内容

  • 不管怎样,我不确定你所描述的是你真正想要的。对于任何大型、多层次的叶节点集,组合的数量很容易达到天文数字。

    xslt要求在执行转换之前将整个文档加载到内存中。这是一个很大的内存占用。你研究过SAX吗?是的,我知道abt SAX解析器。但我一直无法在没有任何xml标记(甚至根标记)的先验信息的情况下展平嵌套的xml。@ColinD通常Xslt处理器支持流式处理,因此您不必将整个文档加载到内存中。请参阅。@user1397016使用Xslt并不需要了解实际的标记,但需要了解结构-您可以通过使用来实现。@Filburt streaming Xslt是xsl spec(2.0+)下一个版本考虑的功能。我想现在大多数做流媒体处理的处理器,只在特定的情况下做,所以我不确定它是否可靠。我不认为你给出的解决方案会给出期望的输出。。你能把你的逻辑放在我介绍的案例上,看看它是否给出了相同的结果吗。你的逻辑不会重复父元素。如果我在什么地方弄错了,请纠正我!好吧,正确地指定输出,而不是使用示例!在您的情况下,B和E不是父元素!