0

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 パーサーは新しいハンドラをすぐに使用し始める必要があります。

委任しているかどうかを自分で記録し、余分な呼び出しを無視することで、レポート動作を回避できますが、後で噛まれるような愚かなことをしているのではないかと思います。

誰もこれを経験していますか?

4

2 に答える 2

2

おそらく、コールバックを発行する元の SAX パーサーを維持し、その下にある別のハンドラーに置き換えて、異なる実装で SAX コールバック メソッドをプロキシするだけで、現在行っているように実際の XML 読み取りを実行しない方が簡単だと思います。

例 (疑似コード)

class SaxHandler {
   SaxProxy proxy = new SaxProxyImpl();
   public void startElement(e) {
      proxy.startElement(e);
   }
}

proxy必要に応じて別の実装に交換します。プロキシのスタックが必要になると思われ、適切なendElement()コールバックでスタックをポップします。

于 2013-07-03T11:48:18.437 に答える