Erro em acentuação gerando XML

10 respostas
pyro

Pessoal, estou gerando um arquivo XML utilizando o Jdom conforme o exemplo abaixo:

Element agenda = new Element("Agenda");
        Document xmlDocumento = new Document(agenda);
        
        Element contato = new Element("Contato");
        contato.setAttribute("id", "12345");
        
        Element nome = new Element("Nome");
        nome.setText("Teste de nome XML");
        Element telefone = new Element("Telefone");
        telefone.setText("1354-31354");
        Element endereco = new Element("Endereco");
        endereco.setText("Rua sem nome e sem número");
        Element email = new Element("email");
        email.setText("[email removido]");
        
        contato.addContent(nome);
        contato.addContent(telefone);
        contato.addContent(endereco);
        contato.addContent(email);
        
        agenda.addContent(contato);
        
        XMLOutputter xmlOut = new XMLOutputter();
        try {
            xmlOut.output(xmlDocumento, System.out);
            
            FileWriter arquivo = new FileWriter(new File("d:/teste_xml.xml"));
            xmlOut.output(xmlDocumento, arquivo);
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }

Os caracteres com acento estão saindo todos zoneados, provavelmente por causa do encoding.
No arquivo XML no cabeçalho consta UTF-8, o UTF-8 não aceita caracteres ou eu estou gerando o arquivo errado?

10 Respostas

R

UTF-8 não aceita acentuação - vc pode apelar para sequencias de escape { ou para blocos CDATA

S

Seu editor está gerando este seu arquivo em java em qual charset ?

Pois pelo que vejo é bem provável que sua IDE esteja gerando o texto em iso e seu xml esteja em utf.

Se você usar eclipse vá em “Edit > Set Enconding” e escolhe UTF-8.

espero te ajudado []'s

Fernando_Generoso_da

Pois é…Isso é um problema.

Está saindo zoneado por causa do encoding sim…Tu tem 2 opções:

utilizar o encoding = ISO-8859-1, ou trocar os caracteres acentuados por seus respectivos valores unicode (procurar no google).

A segunda opção é a mais complicada, porém a que vai te dar menos dor de cabeça depois de implementada, pelo menos na minha opinião.

Fernando Rosa

bruno_savi

mude de UTF para ISO-8859-1
e resolva o problema.

Fernando_Generoso_da

Bruno,

vai resolver o problema pontualmente. Porém se esse xml for utilizado por um servidor de aplicação, tanto os dados que serão gravados em um banco de dados, quanto os dados que serão apresentados em uma página web, via JSF, JSP ou qualquer coisa, vai ficar zoneado também, pois toda a configuração de servidor, encoding de componentes JSF, tudo está como UTF-8. Agora se resolver o problema de acentuação utilizando um xml com encoding UTF-8, na frente não dará problema.

Fernando Rosa

bruno_savi

depende se ele tiver usando tudo em iso não da problema algum.

Fernando_Generoso_da

Se…Aí é q está o problema.

http://www.guj.com.br/posts/list/26061.java

Fernando Rosa

pyro

Achei interessante esse negócio de CDATA, creio que ele possa me ajudar, como eu crio um bloco CDATA em Java? Estou procurando e não encontrei solução.

pyro

bruno_savi:
mude de UTF para ISO-8859-1
e resolva o problema.

Sou dica pode ser interessante também, estou utilizando o Netbeans 6.1 como faço para mudar o encoding do arquivo XML? Pois pelo que vi no código que gerei o UTF-8 é atribuido de forma padrão.

pyro
Pessoal conforme o código abaixo (retirado daqui: [url]http://www.guj.com.br/posts/list/53621.java[/url]) eu consegui gerar um XML em UTF-8 com suporte acentuação, tudo abrindo legal no browser:
public class Main {
    private Document documento;   
    private DocumentBuilderFactory fabrica;   
    private DocumentBuilder builder;  
    
    public Main(){
        fabrica = DocumentBuilderFactory.newInstance();
        try {
            builder = fabrica.newDocumentBuilder();
        } catch (ParserConfigurationException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        documento = builder.newDocument();
        getGera(documento);
    }
    
    public Document getGera(Document doc){
        Element agenda = doc.createElement("Agenda");
        
        Element contato = doc.createElement("Contato");
        contato.setAttribute("id", "12345");
        
        Element nome = doc.createElement("Nome");
        nome.setTextContent("Teste de nome XML");
        
        Element telefone = doc.createElement("Telefone");
        telefone.setTextContent("1354-31354");
        
        Element endereco = doc.createElement("Endereco");
        endereco.setTextContent("Rua sem nome e sem número");
        
        Element email = doc.createElement("email");
        email.setTextContent("[email removido]");
        
        doc.appendChild(agenda);
        agenda.appendChild(contato);
        agenda.appendChild(nome);
        agenda.appendChild(telefone);
        agenda.appendChild(endereco);
        agenda.appendChild(email);   
        
        Transformer tran;  
        try {
            tran = TransformerFactory.newInstance().newTransformer();
            tran.setOutputProperty(OutputKeys.INDENT, "yes");
            
            Result out = new StreamResult("d:/teste_sem_dom.xml");  
            tran.transform(new DOMSource(doc), out);

        } catch (TransformerConfigurationException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }catch (TransformerException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
          
        System.out.println("Stream OK!");
        
        return doc;
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Main();
    }

}

Alguém por acaso sabe onde eu defino o ISO-8859-1 nesse documento? É que em alguns caso vou precisar gerar ele em ISO mesmo.

Criado 15 de julho de 2008
Ultima resposta 16 de jul. de 2008
Respostas 10
Participantes 5