4

ウェブを検索し、stackoverflow を上下に検索しました。解決策はありません。純粋な xslt here内でこれを行う方法を見つけましたが。

しかし問題は、結果の xml が数百 MB の大きさになることです。したがって、これを Java の SAX で行う必要があります。(xsltでタグ付けしましたが、xsltソリューションは使用しないでください;-))

もっと詳しく説明しましょう。解析する必要がある複数の xml ファイル (InputSteam が望ましい) がいくつかあります。ファイルまたは InputStream は次のようになります

入力ストリーム1

<root>
  <doc>
    <tag>test1</tag>
  </doc>
  <doc>
    <tag>test2</tag>
  </doc>
  ...
</root>

入力ストリーム 2

<root>
  <doc>
    <tag>test3</tag>
  </doc>
  <doc>
    <tag>test4</tag>
  </doc>
  ...
</root>

inputstream1+inputstream2+...+inputstreamN =結果の xml . 次のようになります

<root>
  <doc>
    <tag>test1</tag>
  </doc>
  <doc>
    <tag>test2</tag>
  </doc>
  ...
   <doc>
    <tag>test3</tag>
  </doc>
  <doc>
    <tag>test4</tag>
  </doc>
  ...
</root>

誰かがこれに対する解決策またはリンクを持っていますか? これはカスタム InputSource を実装することで可能ですか、それともカスタム ContentHandler を使用する必要がありますか? または、これはjoost/stxで可能ですか?

ContentHandler を使用できれば、いくつかの小さな変換を適用できるという利点があります (これは既に実装しています)。しかし、問題は、複数のファイルまたは InputStream を InputSource として渡す方法がわからないことです。

XMLReader xmlReader = XMLReaderFactory.createXMLReader();
xmlReader.setContentHandler(customHandler);
xmlReader.parse(getInputSource()); // only one InputStream possible

または、ContentHandler 内で直接 InputStreams を解析する必要がありますか?

4

4 に答える 4

2

私はこれを自分で行ったことはありませんが、IBM developerworks の記事を見て、これがかなり簡単になったように見えたことを思い出しました。

今は少し古いですが、http://www.ibm.com/developerworks/xml/library/x-tipstx5/index.htmlを試してください

これは SAX ではなく StAX です。現在の JDK に StAX が含まれているかどうかはわかりません。そうでない場合は、おそらくhttp://stax.codehaus.org/から入手できます。

于 2010-02-16T20:42:55.477 に答える
1

Saxon の有料版を試してみるのもよいでしょう。メモリ内の完全な DOM を必要とせずに、オンザフライで XSLT を処理できます。

于 2010-02-16T20:08:46.973 に答える
0

ファイルをマージする最も効果的な方法は、VTD-XMLが提供するバイト レベルのカット アンド ペースト機能を使用することです。両方のファイルを取得し、それらを VTDNav オブジェクトに解析してから、XMLModifier オブジェクトをインスタンス化し、2 番目のファイルからフラグメントを取得して、それらを最初のファイルに挿入します...これは SAX よりもはるかに効率的です..また、結果の XMLファイルへの書き込み方向を取得します。メモリに保存する必要はありません。以下は、20 行未満の完全なコードです...

import com.ximpleware.*;
import java.io.*;

public class merge {
    // merge second.xml into first.xml assuming the same encoding
    public static void main(String[] s) throws VTDException, IOException{
        VTDGen vg = new VTDGen();
        if (!vg.parseFile("d:\\xml\\first.xml", false))
            return;
        VTDNav vn1=vg.getNav();
        if(!vg.parseFile("d:\\xml\\second.xml", false))
            return;
        VTDNav vn2 = vg.getNav();
        XMLModifier xm = new XMLModifier(vn1);
        long l = vn2.getContentFragment();
        xm.insertBeforeTail(vn2, l);
        xm.output("d:\\xml\\merged.xml");   
    }
}
于 2010-02-18T09:11:24.767 に答える