Manipulação de Strings em XML

4 respostas
J

Tenho um documento XML em que armazeno um cabeçalho com uma série de informações e, abaixo dele, uma lista de objetos do tipo Anotação.

Tenho um problema para remover um objeto Anotação específico do arquivo.
Estou fazendo da seguinte forma:

FileInputStream fis = new FileInputStream(arquivoXML);
byte[] bytes = new byte[(int)arquivoXML.length()];
int resultado = fis.read(bytes);
String XMLTotal = new String(bytes);
/*Ou seja, lendo o conteúdo binário do arquiivo XML e obtendo uma grande String que representa meu XML*/

String anotacaoEmXML = obtemXMLdeAnotacao(anotacao);
/*Este método gera uma String que representa a notação parâmetro em XML. Este mesmo método é usado para gravar a anotação no arquivo e funciona perfeitamente*/

if(XMLTotal.contains(anotacaoEmXML))
{
   xmlTotal.replace(anotacaoEmXML,"");
   /*A idéia é substituir o fragmento XML que representa a anotação por uma String vazia*/
   gravaArquivo(xmlTotal,nomeDoArquivo);
   /*Este método eu utilizo também para gerar o XML inicial e funciona perfeitamente*/
}
Todavia, o fragmento continua lá, mesmo depois que salvo o documento...Se eu fizer o teste
if(XMLTotal.contains(anotacaoEmXML))
Logo abaixo da última linha de código, obterei um true. Ou seja, o fragmento não está sendo substituído. O que pode ser?

Não estou conseguindo usar o DOM para manipular o XML devido a um problema com o namespaces, por isso tive que fazer assim, já que me garantiram que o namespaces está correto...

4 Respostas

gallo

Jokabeludoido, na linha 12 do seu arquivo faça o seguinte:

xmlTotal = xmlTotal.replace(anotacaoEmXML,"");

E veja se funciona.

Abraço

dudaskank

Bom, String é uma classe imutável, então quando você chama xmlTotal.replace(anotacaoEmXML,"");, seu resultado não fica em xmlTotal, e sim perdido por aí… para fazer o que você quer, ficaria xmlTotal = xmlTotal.replace(anotacaoEmXML,"");

Mas outras coisas, o javadoc sugere, caso vá manipular arquivos texto, usar o FileWriter e FileReader, no lugar do FileInputStream e FileOutputStream. FileWriter/Reader são para streams de caracteres, como a documentação diz. Também vale a pena considerar utilizar as classes do java.nio, e principalmente descobrir porque você não consegue usar as funções do DOM como falou… alguma coisa tá errada, manda o código que você tentou com as exceções, que acho que ficaria melhor o código.

abração

J

Bah, pior que eu me toquei disso agora a pouco, quando estava fazendo ais um teste…Olhei novamente para esta linha e vi a m#$%a…Entrei aqui pra dizer que já tinha descoberto. De qualquer forma, muito obrigado pela atenção, galera…O pessoal aqui do GUJ é de fé mesmo!

J

Pois é, eu até pensei em utilizá-los, mas pensei que meu processo poderia ficar mais lento. Não sei, foi intuição…Ia fazer um teste comparativo mas acabei esquecendo, já que dessa forma funcionou (o grande mal do programador :evil:preguiçoso). Mas porque essas classes são mais indicadas? Saberia me dizer?

Na hora de construir o meu documento ele apontava um erro de namespaces. Encontrei esse erro às pencas aqui no GUJ e ninguém soube apontar uma solução na época…Como me disseram que o namespaces deveria ser esse que eu uso, de qqer forma, tive que pensar numa gamb…quer dizer…forma alternativa de fazer isso.

Criado 30 de janeiro de 2009
Ultima resposta 30 de jan. de 2009
Respostas 4
Participantes 3