Pequena modificação em um documento XML usando StAX
Pergunta
Atualmente estou tentando ler um arquivo XML, fazer algumas pequenas alterações (alterar o valor de alguns atributos) e gravá-lo novamente.
Eu pretendia usar um analisador StAX (javax.xml.stream.XMLStreamReader
) para ler cada evento, ver se era algum que eu queria alterar e depois passar direto para o redator StAX (javax.xml.stream.XMLStreamReader
) se nenhuma alteração for necessária.
Infelizmente, isso não parece ser tão simples - o escritor não tem como pegar um tipo de evento e um objeto analisador, apenas métodos como writeAttribute
e writeStartElement
.Obviamente eu poderia escrever uma grande instrução switch com um case para cada tipo possível de elemento que pode ocorrer em um documento XML, e apenas escrevê-lo novamente, mas parece ser um grande problema para algo que parece ser simples .
Há algo que estou faltando que facilita a gravação de um documento XML muito semelhante àquele que você lê com StAX?
Solução
StAX funciona muito bem e é muito rápido.Usei-o em um projeto para analisar arquivos XML de até 20 MB.Não tenho uma análise completa, mas foi definitivamente mais rápido que o SAX.
Quanto à sua pergunta:A diferença entre streaming e manipulação de eventos, AFAIK é o controle.Com a API de streaming você pode percorrer seu documento passo a passo e obter o conteúdo desejado.Enquanto a API baseada em eventos você só pode lidar com o que lhe interessa.
Outras dicas
Depois de um pouco de confusão, a resposta parece ser usar as versões do leitor/gravador de eventos em vez das versões do Stream.
(ou seja,javax.xml.stream.XMLEventReader e javax.xml.stream.XMLEventWriter)
Veja também http://www.devx.com/tips/Tip/37795, que foi o que finalmente me fez mudar.
Eu sei que esta é uma pergunta bastante antiga, mas se alguém estiver procurando algo assim, há outra alternativa:A API de extensão Woodstox Stax2 tem o método:
XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData)
que copia o evento atualmente apontado do leitor de fluxo usando o gravador de fluxo.Isto não é apenas simples, mas muito eficiente.Eu o usei para modificações semelhantes com sucesso.
(como obter XMLStreamWriter2 etc?Todas as instâncias fornecidas pelo Woodstox implementam essas versões estendidas - além disso, há wrappers caso alguém queira usar variantes "básicas" do Stax também)