2016-11-11 3 views
0

J'ai ce code, je veux lire et je veux écrire le "prueba3.xml" en même temps, le fichier est UTF8 mais quand j'écris le fichier, l'encodage change et affiche des caractères étranges, bien que j'ai ajouté format.setEncoding("UTF-8") , il ne le fait pas correctement. Est-il possible de changer le codage de sortie à UTF8 avec jdom SAXBuilder?Comment changer en même temps le codage de sortie d'un XML de lecture et d'écriture avec Jdom?

XML d'entrée:

<?xml version="1.0" encoding="UTF-8"?> 
<prueba> 
    <reg id="576340"> 
     <dato cant="856" id="6" val="-1" num="" desc="ñápás" /> 
     <dato cant="680" id="1" val="-1" num="" desc="résd" /> 
     <dato cant="684" id="5" val="-1" num="" desc="..да и вообем" /> 
     <dato cant="1621" id="1" val="-1" num="" desc="hi" /> 
     <dato cant="1625" id="5" val="-1" num="" desc="Hola" /> 
    </reg> 
</prueba> 

Voici le code:

public static void main(String[] args) throws FileNotFoundException, JDOMException, IOException 
{ 
    //Se crea un SAXBuilder para poder parsear el archivo 
    File xml = new File("c:\\prueba3.xml"); 
    Document doc = (Document) new SAXBuilder().build(xml); 

    Element raiz = doc.getRootElement(); 
    //Recorremos los hijos de la etiqueta raíz 
    List articleRow = raiz.getChildren("reg"); 

    for (int i = 0; i < articleRow.size(); i++) { 

     Element row = (Element) articleRow.get(i); 
     List images = row.getChildren("dato"); 

     for (int j = 0; j < images.size(); j++) { 

      Element row2 = (Element) images.get(j); 
      String texto = row2.getAttributeValue("desc") ; 
      String id = row2.getAttributeValue("id"); 

        if ((texto != null) && (texto !="") && (id.equals("1"))){ 
        row2.getAttribute("desc").setValue("Raúl").toString(); 
        } 
     } 

     Format format = Format.getRawFormat(); 
     format.setEncoding("UTF-8"); 
     XMLOutputter xmlOutput = new XMLOutputter(format); 
     xmlOutput = new XMLOutputter(format); 
     xmlOutput.output(doc, new FileWriter("c:\\prueba3.xml")); 
    } 

    System.out.println("fin"); 
} 

XML de sortie:

<?xml version="1.0" encoding="UTF-8"?> 
<prueba> 
    <reg id="576340"> 
     <dato cant="856" id="6" val="-1" num="" desc="s" /> 
     <dato cant="680" id="1" val="-1" num="" desc="Ra/> 
     <dato cant="684" id="5" val="-1" num="" desc="..?? ? ??????" /> 
     <dato cant="1621" id="1" val="-1" num="" desc="Ra/> 
     <dato cant="1625" id="5" val="-1" num="" desc="Hola" /> 
</reg> 
</prueba> 

Salutations et merci pour votre temps.

Répondre

0

Il s'agit d'un problème relativement courant lors de l'utilisation de JDOM - en particulier dans les pays/régions avec des alphabets non latins. Dans certains sens, je regrette de ne pas avoir utilisé les sorties Writer dans JDOM.

Voir la JavaDoc sur XMLOutputter aussi: http://www.jdom.org/docs/apidocs/org/jdom2/output/XMLOutputter.html

Le problème est que FileWriter utilise l'encodage par défaut du système pour convertir de l'écrivain aux octets de données sous-jacentes. JDOM ne peut pas contrôler cette conversion.

Si vous modifiez la ligne de code:

xmlOutput.output(doc, new FileWriter("c:\\prueba3.xml")); 

d'utiliser un OutputStream au lieu d'un Writer:

try (OutputStream fos = new FileOutputStream("c:\\prueba3.xml")) { 
    xmlOutput.output(doc, fos); 
} 

... il utilisera la sortie comme un octet -stream, et le codage par défaut des systèmes n'interférera pas avec la sortie.

(Il n'y a pas P.S. raison d'attribuer le xmlOutput par exemple deux fois.)

+0

Salut, merci beaucoup, maintenant il fonctionne correctement, aussi simple que cela me semble maintenant que vous expliquiez XD. Salutations. –