2008-12-12 6 views
1

Je voudrais analyser un document en utilisant SAX, et créer un sous-document à partir de certains des éléments, tout en traitant les autres uniquement avec SAX. Donc, étant donné ce document:Imbrication de SAX ContentHandlers

<DOC> 
    <small> 
     <element /> 
    </small> 
    <entries> 
     <!-- thousands here --> 
    </entries> 
    </DOC> 

Je voudrais analyser le DOC et DOC/entrées des éléments à l'aide du SAX ContentHandler, mais quand je frappe <small> Je veux créer un nouveau document contenant juste le <small> et ses enfants.

Existe-t-il un moyen facile de le faire, ou dois-je construire le DOM moi-même, à la main?

Répondre

4

Une approche consiste à créer un ContentHandler qui surveille les événements qui signalent l'entrée ou la sortie d'un élément <small>. Ce gestionnaire agit comme un proxy, et en mode "normal" passe les événements SAX directement au "réel" ContentHandler.

Cependant, lorsque l'entrée dans un élément <small> est détecté, le proxy est responsable de la création d'un TransformerHandler (avec un no-op, « null » Transform), plumbed jusqu'à un DOMResult. Le TransformerHandler attend tous les événements qu'un document complet et bien formé produirait; vous ne pouvez pas lui envoyer immédiatement un événement startElement. À la place, simulez le début d'un nouveau document en appelant d'abord setDocumentLocator, startDocument et d'autres événements nécessaires sur l'instance TransformerHandler.

Ensuite, jusqu'à la fin de l'élément élément <small> est détecté par le proxy, tous les événements sont transmis à ce TransformerHandler au lieu du "réel" ContentHandler. Lorsque la balise de fermeture </small> est rencontrée, le proxy simule la fin d'un document en appelant endDocument sur TransformerHandler. Un DOM est maintenant disponible en tant que résultat du TransformerHandler, qui contient uniquement le fragment <small />.

1

Il me semble que la réponse dépend de si vous avez besoin du 'nouveau document' en mémoire. Si vous utilisez ensuite DOM, alternativement si vous allez simplement diffuser le 'nouveau document', alors StAX irait probablement mieux avec la nature événementielle de SAX.

0

Je n'ai eu aucun problème à créer plusieurs documents simultanés à partir d'un flux SAX. C'est à peu près SOP pour tout flux orienté documentaire. Quelle difficulté éprouvez-vous à faire cela? La hiérarchie de vos classes ne doit pas correspondre à la hiérarchie du flux SAX.

Questions connexes