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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top