0

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

如果 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。这个问题有通用的解决方案吗?

4

2 回答 2

0

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

于 2012-05-15T20:34:14.083 回答
0

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

看起来你有两个选择:

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

无论哪种方式,我都不确定您所描述的实际上是您想要的。对于任何大型的多级叶节点集,组合的数量很容易成为天文数字。

于 2012-05-16T06:30:20.953 回答