2008-12-15 2 views
3

J'ai fait une recherche Google pour cela pendant un moment mais je n'arrive pas à le trouver et ça devrait être facile. Je veux ajouter un CR à la fin d'un fichier XML que je crée avec un Transformer. Y at-il un moyen de le faire?java ajouter au fichier

J'ai essayé ce qui suit, mais cela a abouti à un fichier vide?


Transformer xformer = TransformerFactory.newInstance().newTransformer(); 
xformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "file:///ReportWiz.dtd"); 
xformer.transform(source, result); 
OutputStream writer = new FileOutputStream(file); 
Byte b = '\n'; 
writer.write(b); 
writer.close();

Répondre

10

simple ... Il suffit d'ajouter l'option append:

new FileOutputStream(f, true /* append */); 
0

Je ne connaissais pas cette classe Transformer. Mais je ne vois pas de lien entre les variables de votre script/fichier et vos variables xformer/source/result ... On dirait que vous écrivez seulement un saut de ligne.
Sauf si vous avez omis une partie essentielle.

+0

Ce sera la classe Transformer dans jaxp. –

1

La réponse évidente est d'utiliser StreamResult avec un Writer, et d'ajouter votre personnage à l'auteur avant la fermeture.

Vous semblez essayer de rouvrir le fichier pour ajouter le caractère. Les deux formes d'argument des constructeurs FileOutputStream incluent un indicateur append.

+1

L'utilisation d'un enregistreur avec des bibliothèques XML entraîne généralement des problèmes, car le transformateur ne peut pas découvrir l'encodage Writer afin de définir correctement l'attribut de codage incorporé dans le fichier XML. Utilisez un OutputStream à la place. – erickson

5

Il existe plusieurs options ici.

Je suppose que votre résultat est un StreamResult que vous créez avec un String spécifiant le chemin du fichier de destination. Vous pourriez envisager d'ouvrir un FileOutputStream vous-même, et de construire votre StreamResult avec ça. Ensuite, lorsque le transformateur est terminé, ajoutez la terminaison de ligne, videz et fermez le flux. En l'absence de contraintes, j'utiliserais cette approche.

Si vous souhaitez rouvrir le fichier, comme indiqué dans la question, vous devez utiliser un constructeur FileOutputStream qui prend l'argument append facultatif. Définissez ceci sur true pour éviter d'écraser le résultat de la transformation qui vient d'être terminée.

Vous pouvez également explorer la définition de la propriété de sortie indent dans votre transformation ou inclure la terminaison de ligne nécessaire directement dans votre modèle.

0

une note, assurez-vous que vous écrivez votre retour à la ligne en utilisant le même caractère que vous encodage utilisé pour la serializaton xml ou votre fichier sera brisé.

Questions connexes