7

更新Java コミュニティには、NIO および XML 解析を実行できる XML パーサーがありません。これは私が見つけた最も近いもので、不完全です: http://wiki.fasterxml.com/AaltoHome

次のコードがあります。

InputStream input = ...;
XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();

XMLStreamReader streamReader = xmlInputFactory.createXMLStreamReader(input, "UTF-8");

問題は、メソッド #createXMLStreamReader() が入力ストリームに XML ドキュメント全体があることを想定しているのはなぜですか? XML データの一部を処理できないように見えるのに、なぜ「ストリーム リーダー」と呼ばれるのですか? たとえば、私が餌をやる場合:

<root>
    <child>

それに、終了タグがないことがわかります。ストリーム リーダー自体の反復処理を開始する前でも。XMLStreamReader を適切に使用する方法がわからないだけだと思います。バラバラにデータを供給できるはずですよね?ネットワークソケットから入ってくる XML ストリームを処理していて、ソーステキスト全体をメモリにロードしたくないので、これが必要です。

助けてくれてありがとう、ユリ。

4

6 に答える 6

3

必要なものを取得できます-部分的な解析ですが、現在利用可能なデータの最後に到達したときにストリームを閉じてはなりません。ストリームを開いたままにしておくと、パーサーはストリームの最後に到達したときに単純にブロックします。さらにデータがある場合は、それをストリームに追加すると、パーサーは続行します。

この配置には 2 つのスレッドが必要です。1 つのスレッドはパーサーを実行し、もう 1 つのスレッドはデータをフェッチします。2 つのスレッドを橋渡しするには、パイプ (リーダー スレッドからパーサーが使用する入力ストリームにデータをプッシュする PipeInputStream と PipeOutputStream のペア) を使用します。(パーサーは PipeInputStream からデータを読み取っています。)

于 2010-05-31T01:15:28.667 に答える
1

ストリームには、XMLドキュメント全体のコンテンツが含まれている必要がありますが、すべてが同時にメモリ内にあるわけではありません(これがストリームの機能です)。ストリームとリーダーを開いたままにして、コンテンツのフィードを継続できる場合があります。ただし、整形式のXMLドキュメントの一部である必要があります。

提案:さらに先に進む前に、ソケットとストリームがどのように機能するかについてもう少し読みたいと思うかもしれません。

お役に立てれば。

于 2010-04-16T15:09:06.843 に答える
1

コンテンツ「プッシュ」を備えた NIO が絶対に必要な場合は、Aalto 用の API の完成に関心のある開発者がいます。パーサー自体は完全な Stax 実装であり、代替の「プッシュ入力」 (InputStream を使用する代わりに入力を供給する) です。そのため、興味がある場合は、代わりにメーリング リストを確認することをお勧めします。誰もが StackOverflow の質問を読むわけではありません。:-)

于 2010-10-02T00:37:38.047 に答える
0

どのJavaバージョンを使用していますか? JDK 1.6.0_19 では、期待どおりの動作が得られます。サンプルの XML フラグメントを繰り返し処理すると、次の 3 つのイベントが発生します。

  • START_ELEMENT (ルート)
  • CHARACTERS ( と の間の空白)
  • START_ELEMENT (子)

next() の 4 回目の呼び出しで XMLStreamException: ParseError at [row,col]:[2,12] がスローされます。メッセージ: XML ドキュメント構造は、同じエンティティ内で開始および終了する必要があります。

于 2010-04-16T15:17:39.323 に答える
-2

このリンクを参照して、ストリーミング パーサーのしくみと、それによってメモリ フット プリントがどのように小さく保たれるかについて理解してください。着信 XML の場合、まず着信 XML をシリアル化し、適切な形式の XML を作成してから、ストリーミング パーサーに渡す必要があります。

http://www.devx.com/xml/Article/34037/1954

于 2010-04-16T15:16:32.183 に答える