6

現在、XMLファイルを読み込んで、いくつかの小さな変更を加え(一部の属性の値を変更して)、再度書き戻そうとしています。

StAXパーサー()を使用しjavax.xml.stream.XMLStreamReaderて各イベントを読み取り、変更したいイベントかどうかを確認し、javax.xml.stream.XMLStreamReader変更が必要ない場合はStAXライター()に直接渡すつもりでした。

残念ながら、それはそれほど単純ではないように見えます-ライターにはイベントタイプとパーサーオブジェクトを取得する方法がなく、とのようなメソッドのみがwriteAttributeありwriteStartElementます。明らかに、XMLドキュメントで発生する可能性のあるすべてのタイプの要素のケースを含む大きなswitchステートメントを記述し、それを再度書き戻すことはできますが、単純なはずの何かには多くの問題があるようです。 。

StAXで読み込んだものと非常によく似たXMLドキュメントを簡単に書き出すことができる何かが欠けていますか?

4

3 に答える 3

4

少しいじくり回した後、答えはストリームバージョンではなくイベントリーダー/ライターバージョンを使用することのようです。

(つまり、javax.xml.stream.XMLEventReaderおよびjavax.xml.stream.XMLEventWriter)

http://www.devx.com/tips/Tip/37795も参照してください。これが、私を最終的に動かした理由です。

于 2008-08-14T04:13:24.717 に答える
3

StAX はかなりうまく機能し、非常に高速です。プロジェクトで使用して、最大 20MB の XML ファイルを解析しました。詳細な分析はできていませんが、SAX よりも確実に高速でした。

あなたの質問について: ストリーミングとイベント処理の違いは、AFAIK はコントロールです。ストリーミング API を使用すると、ドキュメントを段階的に見て、必要なコンテンツを取得できます。イベントベースの API では、関心のあるものしか処理できません。

于 2008-08-14T05:52:27.730 に答える
2

これはかなり古い質問ですが、他の誰かがこのようなものを探している場合は、別の選択肢があります。WoodstoxStax2拡張APIには次のメソッドがあります。

XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData) 

これは、ストリームライターを使用してストリームリーダーから現在ポイントされているイベントをコピーします。これは単純であるだけでなく、非常に効率的です。私はそれを同様の変更に使用して成功しました。

(XMLStreamWriter2などを取得する方法?Woodstoxが提供するすべてのインスタンスはこれらの拡張バージョンを実装します-さらに、誰かが「基本的な」Staxバリアントを使用したい場合に備えてラッパーもあります)

于 2010-08-10T20:12:44.567 に答える