展平xml文件

时间:2012-05-15 19:27:48

标签: 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>

   <E> e1 </E>     

</A>

我应该得到如下输出:

a1 b d1 e1

a1 b d2 e1

a1 b d3 e1

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

看起来你有两个选择:

  1. 使用SAX将整个树加载到内存中,然后实施爆炸算法。
  2. 对输入数据进行传递以提取结构并在每个叶节点集上建立位置游标;然后在输入上进行多次传递,使用游标决定每次传递的输出。
  3. 无论哪种方式,我都不确定你所描述的实际上是你想要的。对于任何大型,多级别的叶节点集合,组合的数量很容易变得天文数字。