ContentHandlers nidificação SAX
Pergunta
Eu gostaria de analisar um documento utilizando SAX, e criar um subdocumento a partir de alguns dos elementos, ao processar outros puramente com SAX. Assim, dado neste documento:
<DOC>
<small>
<element />
</small>
<entries>
<!-- thousands here -->
</entries>
</DOC>
Gostaria de analisar o DOC e DOC / elementos entradas usando o SAX ContentHandler, mas quando eu bati <small>
Eu quero criar um novo documento que contém apenas o <small>
e seus filhos.
Existe uma maneira fácil de fazer isso, ou eu tenho que construir o DOM mim mesmo, à mão?
Solução
Uma abordagem é criar um ContentHandler
que os relógios para eventos que sinalizam a entrada ou saída de um elemento <small>
. Este manipulador atua como um proxy, e no modo "normal" passa os eventos SAX direto para a ContentHandler
"real".
No entanto, quando entrada em um elemento <small>
é detectado, o proxy é responsável pela criação de uma TransformerHandler
(com uma-op não, "nulo" transformar), sondado -se a um DOMResult
. O TransformerHandler
espera que todos os eventos que um documento completo, bem-formado que produzem; você não pode enviá-lo um evento startElement
imediatamente. Em vez disso, simular o início de um novo documento, invocando setDocumentLocator
, startDocument
, e outros eventos necessárias na instância TransformerHandler
primeiro.
Então, até o final do elemento elemento <small>
é detectado pelo proxy, todos os eventos são encaminhados para este TransformerHandler
vez do ContentHandler
"real". Quando a tag </small>
fechamento é encontrado, o proxy simula o fim de um documento invocando endDocument
na TransformerHandler
. Um DOM está agora disponível como resultado da TransformerHandler
, que contém apenas o fragmento <small />
.
Outras dicas
Parece-me que a resposta depende se você precisa do 'novo documento' na memória. Se você, em seguida, usar DOM, alternativamente, se você está indo só para transmitir o 'novo documento' então StAX provavelmente se encaixam melhor com a natureza orientada a eventos de SAX.
Eu tive nenhum problema construindo vários documentos simultâneas fora de um fluxo de SAX. É praticamente SOP para qualquer fluxo de business-orientado a documentos. Que dificuldades você está tendo com a fazer isso? A hierarquia de suas classes não precisa coincidir com a hierarquia do fluxo de SAX.