2010-05-29 7 views
3

Je tente d'écrire un fichier de bibliothèque XML qui peut être relu dans mon programme.Écriture de XML dans différents codages de caractères avec Java

Le code auteur de fichier est le suivant:

XMLBuilder builder = new XMLBuilder(); 
Document doc = builder.build(bookList); 
DOMImplementation impl = doc.getImplementation(); 
DOMImplementationLS implLS = (DOMImplementationLS) impl.getFeature("LS", "3.0"); 
LSSerializer ser = implLS.createLSSerializer(); 
String out = ser.writeToString(doc); 

//System.out.println(out); 

try{ 
    FileWriter fstream = new FileWriter(location); 
    BufferedWriter outwrite = new BufferedWriter(fstream); 
    outwrite.write(out); 
    outwrite.close(); 
}catch (Exception e){ 
} 

Le code ci-dessus n'écrire un document XML.

Cependant, dans l'en-tête XML, c'est un attribut que le fichier est codé en UTF-16.

quand je l'ai lu dans le fichier, je reçois l'erreur:

« contenu non autorisé dans Prolog »

cette erreur ne se produit pas lorsque l'attribut de codage est modifié manuellement en UTF-8.

J'essaie d'obtenir le code ci-dessus pour écrire un document XML codé en UTF-8, ou analyser avec succès un fichier UTF-16.

le code d'analyse syntaxique est

DocumentBuilderFactory factory = 
DocumentBuilderFactory.newInstance(); 
DocumentBuilder loader = factory.newDocumentBuilder(); 
Document document = loader.parse(filename); 

la dernière ligne renvoie l'erreur.

+0

Il pourrait être utile que vous nous disiez ce qu'est XMLBuilder. Googling pour 'XMLBuilder' montre (je pense) 7 classes différentes ... dans la première page des résultats de recherche! –

+0

oh, désolé, XMLBuilder est une classe auto-créée qui prend un SortedSet of Book (une classe wrapper pour un fichier et des métadonnées) et renvoie un document construit. Cette partie fonctionne bien. – romnempire

Répondre

2

La méthode LSSerializer writeToString ne permet pas au sérialiseur de choisir un codage.

Avec la méthode setEncoding d'une instance de LSOutput, la méthode d'écriture de LSSerializer peut être utilisée pour changer le codage. le LSOutput CharacterStream peut être défini sur une instance de BufferedWriter, de sorte que les appels de LSSerializer à écrire vont écrire dans le fichier.

Questions connexes