1

次のコードがどのように機能するかについて理解に問題があります。

XMLInputFactory xif = XMLInputFactory.newFactory();
XMLOutputFactory xof = XMLOutputFactory.newFactory();

XMLEventReader reader = xif.createXMLEventReader(/* ... */);
XMLEventWriter writer = xof.createXMLEventWriter(/* ... */);

writer.add(reader);

メソッド writer.add([some reader]) は、リーダーからすべてのイベントを読み取り、結果としてそれらを書き込みます。悲しいことに、次のことが起こります。

入力

<root><c/></root>

に変換されます

<root><c><c/></root>

XML の観点からは、これらは等しいツリーですが、人間にとってはそうではありません ;)

同じ出力を得るにはどうすればよいですか?

参考までに: "XML イベント" をフィルタリングするには、後で XMLEvent[Reader|Writer] ペアが必要です。

4

2 に答える 2

1

XMLEventsのリストによると、区別する方法がないようで、実際にStartElementイベントを生成しEndElementます。StartElement消費者は、aの直後に。が続く場合に最適化する必要がありEndElementます。

これは明らかXMLEventReaderに工場から返送された場合ではありません。この動作を自分で最適化したい場合は、次のようなことを行う以外に方法はありません。

  • XMLEventReaderによって返される具体的な実装は何かを確認してくださいcreateXMLEventReader
  • XMLEventReaderこのケースを最適化するために実装をサブクラス化する
  • サブクラスXMLInputFactoryとオーバーライドして、サブクラスcreateXMLEventReaderのインスタンスを返しますXMLEventReader

これが複雑すぎるように聞こえる(または機能しない)場合は、を使用するソリューションを使用することをお勧めしますXMLStreamWriter。これには専用のメソッドがありwriteEmptyElementます。

(または、私の自家製のかわいいプリンターを試してみることができます、それはに基づいていますXMLStreamWriter

于 2010-03-14T16:31:45.057 に答える
1

私が間違っていない限り、Woodstoxは空のタグを生成する (デフォルト) か、生成しないように構成できます (したがって、コンテンツがなくても常に開始 + 終了タグを出力します)。これを XMLStreamWriter 用に構成し、そのストリーム ライターを使用して XMLEventWriter を生成できるため、期待どおりに動作するはずです。

于 2010-04-01T05:59:53.137 に答える