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 の場合は、テラバイトの出力に備えてください。

次の 2 つの選択肢があるようです。

  1. SAX を使用してツリー全体をメモリにロードし、爆発アルゴリズムを実装します。
  2. 入力データをパスして構造を抽出し、各リーフ ノード セットの位置カーソルを確立します。次に、カーソルを使用して各パスで何を出力するかを決定し、入力に対して複数のパスを作成します。

いずれにせよ、あなたが説明したことが実際にあなたが望んでいるものかどうかはわかりません. リーフ ノードの大規模なマルチレベル セットの場合、組み合わせの数は簡単に天文学的な数になる可能性があります。

于 2012-05-16T06:30:20.953 に答える