XmlReader
と を使用して、Android で Java SAX パーサーを作成しましたDefaultHandler
。
その成長するサイズは扱いにくくなったので、私がやりたいことは、特定の要素の下のコンテンツに対する責任を「子」ハンドラーに委任することです。
次の XML があるとします。
<fruit>
<apples>
<pips/>
</apples>
<oranges>
<seeds/>
</oranges>
</fruit>
元のハンドラーの実装を引き継いで、リンゴ、オレンジなどのそれぞれのハンドラーを分離し、完了したらそれらのハンドラーを元に戻すつもりでした。
したがって、私はこのようなことを少しします:
@Override
public void startElement( ... ) ...
{
//...
if ( localName.equals("oranges"))
{
ContentHandler orangeHandler = new OrangeHandler( xmlReader, this );
xmlReader.setContentHandler( orangeHandler );
}
super.startElement( uri, localName, qName, attributes );
}
次に、同様の方法でメイン ハンドラーを復元します。
私が期待すること: startElement()、characters()、endElement() などへのさらなる呼び出しは、新しいハンドラーに移動します。
私が実際に見たもの:それは、メインハンドラーでもこれらのメソッドへの呼び出しを続けていました。
Javadoc は次のように述べています。
public void setContentHandler(ContentHandler ハンドラ)
アプリケーションがコンテンツ イベント ハンドラーを登録できるようにします。
アプリケーションがコンテンツ ハンドラーを登録しない場合、SAX パーサーによって報告されたすべてのコンテンツ イベントは黙って無視されます。
アプリケーションは、解析の途中で新しいハンドラまたは別のハンドラを登録する場合があり、SAX パーサーは新しいハンドラをすぐに使用し始める必要があります。
委任しているかどうかを自分で記録し、余分な呼び出しを無視することで、レポート動作を回避できますが、後で噛まれるような愚かなことをしているのではないかと思います。
誰もこれを経験していますか?