2

私は現在、XMLを分割する必要があるプロジェクトに取り組んでいます。たとえば、次のサンプルがあります。

<Lakes>
  <Lake>
    <id>1</id>
    <Name>Caspian</Name>
    <Type>Natyral</Type>
  </Lake>
  <Lake>
    <id>2</id>
    <Name>Moreo</Name>
    <Type>Glacial</Type>
  </Lake>
  <Lake>
    <id>3</id>
    <Name>Sina</Name>
    <Type>Artificial</Type>
  </Lake>
</Lakes>

私のJavaコードでは、理想的には、この例ではXMLを3つの小さなものに分割し、メッセンジャーサービスを使用してそれぞれを送信します。メッセンジャーサービスのコードは重要ではありません。私はすでにそれをしました。

たとえば、コードが実行される場合は、最初の部分を次のように分割します。

<Lakes>
  <Lake>
    <id>1</id>
    <Name>Caspian</Name>
    <Type>Natyral</Type>
  </Lake>
</Lakes>

次に、Javaコードはこれをメッセージで送信します。次に、次の部分に進み、大きなXMLの最後に到達するまで、それを送信するなどします。これは、XSLTを介して実行することも、Javaを介して実行することもできます。何か案は?

明確にするために、私はXSLTを使用してファイルを分割する方法をほとんど知っていますが、ファイルを分割して各部分を一度に1つずつ送信する方法がわかりません。また、ローカルに何も保存したくないので、理想的にはすべてが文字列に転送されて送信されます。

4

2 に答える 2

3

ファイルをチャンク化する方法が修正され、既知である場合、最も簡単な解決策は、SAXまたはStAXを使用してプログラムでそれを行うことです。私は個人的にこの種のタスクにはStAXを好みます。コードは一般的にクリーンで理解しやすいからですが、SAXも同様にうまく機能します。

XSLTは優れたツールですが、その主な欠点は、1つの出力しか生成できないことです。また、いくつかの例外を除いて、XSLTエンジンはストリーミング処理をサポートしていないため、初期ファイルが大きすぎてメモリに収まらない場合は、それらを使用できません。

更新: XSLT 2.0では<xsl:result-document>、複数の出力ファイルを生成するために使用できますが、チャンクを1つずつ取得し、ファイルに保存したくない場合は、理想的ではありません。

于 2012-07-05T20:42:35.297 に答える
2

(メモリ内にDOMツリーを構築する代わりに)XMLをストリーミングし、外出先でチャンクを切り取ります。タグに出会うたびに、コンテンツをバッファにコピーし始めます。バッファは、最後のタグに出会ったLakeときに送信およびリセットされます。</Lake>

編集JavaでのXMLストリーミングについて詳しくは、このリンクをご覧ください

于 2012-07-05T20:47:12.983 に答える