2010-04-03 5 views
3

J'écris une classe Xml Tag Renamer avec Java qui lit dans un fichier XML, renomme les étiquettes et les réécrit dans un autre fichier XML en utilisant DocumentBuilderFactory et TransformerFactory (les nœuds de texte sont conservés). Cela fonctionnait bien avant avec les textes allemands et anglais, jusqu'à aujourd'hui, quand j'ai essayé de renommer un fichier XML avec du texte russe. Au lieu des textes sources, j'ai obtenu ????? dans le fichier XML nouvellement créé. J'ai essayé de réglage EncodageÉcriture du russe en XML

Une idée de comment corriger cela?

PS. Les chaînes étaient correctes avant d'entrer dans TransformerFactory, car j'ai vérifié dans le débogueur. J'ai essayé de définir OutputKeys.ENCODING à UTF-8 et ISO-8859-5. Aucun d'eux n'a aidé.

La partie du transformateur:

// Output the XML 

// Set up a transformer 
TransformerFactory transFactory = TransformerFactory.newInstance(); 
Transformer transformer = transFactory.newTransformer(); 
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); 
// Fix to a bug about indent in transformer 
transformer.setOutputProperty 
("{http://xml.apache.org/xslt}indent-amount", "4"); 
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 

// TODO encoding parameter 
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 

// Create string from xml tree 
StringWriter sw = new StringWriter(); 
StreamResult result = new StreamResult(sw); 
DOMSource source = new DOMSource(doc); 
transformer.transform(source, result); 

String xmlString = sw.toString(); 

xmlString.replaceAll("\n", System.getProperty("line.separator")); 


// Write to file 
BufferedWriter output = new BufferedWriter(new FileWriter(outputPath)); 
output.write(xmlString); 
output.close(); 

Répondre

3

Je vous suggère de sortir directement le résultat du transformateur de fichier:

transformer.transform(source, new StreamResult(
    new OutputStreamWriter(new FileOutputStream(outputPath), "UTF-8"))); 
+1

Merci! Cela fonctionne avec votre code! J'ai légèrement modifié le mien, et il semble que la clé repose sur 'OutputStreamWriter'. Le problème est probablement celui avec 'FileWriter'" Les constructeurs de cette classe supposent que le codage de caractères par défaut et la taille de tampon d'octets par défaut sont acceptables. "(JavaDoc), et' OutputStreamWriter' supporte le codage personnalisé. Encore une fois apprécié! –

1

Votre problème est (presque certainement) que vous mélanger ce est un personnage et qu'est-ce qu'un octet. C'est quelque chose que vous pouvez utiliser en anglais (et surtout en allemand), mais dans des scripts comme le cyrillique ou le japonais et le chinois, vous devez faire les choses correctement. La première chose à vérifier est de savoir si vous avez des caractères en dehors de la plage \u0000 - \u00ff dans la variable xmlString. Si c'est le cas, vous devez utiliser une instance OutputStreamWriter pour effectuer le mappage des caractères en octets. Sinon, la transformation a déjà été appliquée et vous devez plutôt écrire les octets piégés dans cette chaîne dans le fichier sans les réduire davantage (encore une fois, un OutputStreamWriter est le moyen le plus simple d'obtenir ce résultat, mais en utilisant le codage ISO8859-1 étape car cela ne remappe pas les octets autour).

La sortie du XML transformé directement à partir du transformateur est plus facile que la capture d'abord. Après tout, la plupart des XML ne sont lisibles que par l'homme dans un sens technique ...