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?

Foi útil?

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)

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