2010-02-02 4 views
1

J'ai la fonction suivante:Comment puis-je imprimer des guillemets simples autour des valeurs d'attribut au lieu de guillemets avec la classe javax.xml.transform.Tansformer?

private static void prettyPrint(Document doc, File destFile) 
{ 
    TransformerFactory tfactory = TransformerFactory.newInstance(); 
    Transformer serializer; 

    try 
    { 
     if(!destFile.getParentFile().exists()) 
     { 
      destFile.getParentFile().mkdirs(); 
     } 

     serializer = tfactory.newTransformer(); 

     serializer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); 

     try 
     { 
      serializer.transform(new DOMSource(doc), 
           new StreamResult(new FileOutputStream(destFile))); 
     } 
     catch(FileNotFoundException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
    catch (TransformerException e) 
    { 
     e.printStackTrace(); 
    } 
} 

Je l'utilise pour "pretty print" mon XML. Cependant, il imprime les valeurs des attributs avec des guillemets autour d'eux, par opposition aux guillemets simples. Maintenant, je me rends compte que XML est agnostique concernant les guillemets simples et doubles pour les valeurs, mais le client pour lequel je fournis le XML nécessite des guillemets simples. Donc, cela étant dit, quelqu'un at-il connaissance d'une propriété de sortie que je pourrais définir pour indiquer au transformateur d'imprimer des guillemets simples plutôt que des guillemets doubles?

Merci pour votre aide,

B.J.

+0

Quelle bibliothèque? Le XALAN intégré ou autre chose? –

Répondre

2

Je ne crois pas que ce soit possible avec le sérialiseur standard. Tout analyseur XML conforme aux normes doit gérer les guillemets doubles en entrée. Pouvez-vous trouver pourquoi l'analyse XML du client est cassée, et peut-être la réparer? Sur un autre point, vous déclarez dans vos clés de sortie que le document sera UTF8, mais vous ne semblez pas fournir d'éditeur codé en UTF8. Cela fonctionnera très bien sur Windows, mais échouera sur Solaris, où la valeur par défaut n'est pas UTF8. Pour une portabilité maximale, vous devez vous assurer que votre flux de sortie sera réellement écrit en utilisant UTF8 en indiquant explicitement Java. Il suffit de le déclarer dans l'en-tête XML.

+0

En fait, le code ne fournit aucune sorte de Writer. Il fournit un OutputStream, qui obtient des octets et non des caractères. Ainsi, le sérialiseur convertira les caractères en octets en utilisant UTF-8 et les écrira dans ce flux. Ce n'est pas un problème. –

+0

Ce n'est pas que l'analyse XML du client est cassée, c'est juste que ce XML est une sorte d'exemple XML que nous créons manuellement chaque version, alors que le "vrai" XML est créé pendant une partie d'un processus batch séparé. Le traitement par lots place des guillemets simples autour des noms d'attribut, et le client souhaite que l'exemple de code XML corresponde le plus fidèlement possible au code XML "réel". S'il n'y a aucun moyen de le faire avec le sérialiseur, je suppose que chaque version devra post-traiter le XML et remplacer toutes les guillemets par des guillemets simples, comme Paul l'a suggéré. – Benny

1

Vous pourriez éventuellement post-traiter le XML pour remplacer les guillemets simples par des guillemets simples, bien que ce serait un processus risqué que les nœuds de texte pourraient également contenir des guillemets que vous ne voudriez pas changer. Et les valeurs d'attribut pourraient contenir des guillemets simples, qui fonctionneraient bien lorsqu'ils sont entourés de guillemets doubles mais qui devraient être échappés s'ils sont entourés de guillemets simples. Je pense que je suis en train de me sortir de cette idée, mais j'imagine que cela pourrait devenir réalisable.

Questions connexes