D'impression sortie de javax.xml.transformer.Transformateur avec seulement la norme api java (Indentation et Doctype positionnement)
En utilisant le code simple suivant:
package test;
import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
public class TestOutputKeys {
public static void main(String[] args) throws TransformerException {
//Instantiate transformer input
Source xmlInput = new StreamSource(new StringReader(
"<!-- Document comment --><aaa><bbb/><ccc/></aaa>"));
StreamResult xmlOutput = new StreamResult(new StringWriter());
//Configure transformer
Transformer transformer = TransformerFactory.newInstance()
.newTransformer(); //An identity transformer
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "testing.dtd");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(xmlInput, xmlOutput);
System.out.println(xmlOutput.getWriter().toString());
}
}
- Je obtenir la sortie:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Document comment --><!DOCTYPE aaa SYSTEM "testing.dtd">
<aaa>
<bbb/>
<ccc/>
</aaa>
Question: Le doctype de la balise s'affiche après le document de commentaires. Est-il possible de faire apparaître avant que le document des commentaires?
Question B: Comment puis-je obtenir de l'indentation, en utilisant uniquement les JavaSE 5.0 API?
Cette question est essentiellement identique à La façon dont à-peu-près d'impression xml à partir de java, cependant presque toutes les réponses à cette question dépend de bibliothèques externes. Le seul applicable réponse (posté par un utilisateur nommé Lorenzo Boccaccia) qui n'utilise java de l'api, qui est essentiellement égal au code affiché ci-dessus, mais ne fonctionne pas pour moi (comme indiqué dans la sortie, je n'ai pas l'indentation).
Je devine que vous avez à régler le montant des espaces à utiliser pour l'indentation, comme beaucoup de réponses à des bibliothèques externes faire, mais je n'arrive pas à trouver où le spécifier dans l'api java. Compte tenu du fait que la possibilité de définir une échancrure à la propriété "oui" existe dans l'api java, il doit être possible d'effectuer l'indentation en quelque sorte. Je ne peux pas comprendre comment.
- Question n'a pas de sens. Voulez-vous dire "avant" dans la seconde partie?
- Oui. J'ai édité la question de changer de typo. Je vous remercie.
- Répéter le commentaire que j'ai fait dans le stackoverflow.com/questions/139076/... - vous pouvez maintenant assez d'impression sans bibliothèques externes. Voir xerces.apache.org/xerces2-j/faq-general.html#faq-6. Oui, c'est un Xerces FAQ, mais la réponse standard couvre les classes du JDK. La première 1.5 mise en œuvre de ces classes avaient beaucoup de questions, mais tout fonctionne bien à partir de 1.6 sur. Copiez le LSSerializer exemple dans la FAQ, hacher les "..." bit et ajouter
writer.getDomConfig().setParameter("format-pretty-print", Boolean.TRUE);
après laLSSerializer writer = ...
ligne.
Vous devez vous connecter pour publier un commentaire.
La partie manquante est la valeur de retrait. Vous pouvez définir la mise en retrait et de retrait montant comme suit:
factory.setAttribute("indent-number", 4);
et maintenant ça fonctionne.<?xml version="1.0" encoding="UTF-8"?><Nama-e-Amaal>
. Comment puis-je faire une ligne en dessous?Un peu util classe comme un exemple...
XMLserializer est fourni par xercesImpl de la La Fondation Apache. Voici le maven dependency:
Vous pouvez trouver la dépendance pour votre favori outil de construction ici: http://mvnrepository.com/artifact/xerces/xercesImpl/2.11.0.
Vous pourriez probablement embellir le tout avec un Fichier XSLT. Google lance les quelques résultats, mais je ne peux pas commenter sur leur exactitude.
Pour faire la sortie d'un document XML valide PAS. Un document XML valide, doit commencer par une instruction de traitement. Voir la spécification XML http://www.w3.org/TR/REC-xml/#sec-prolog-dtd pour plus de détails.
xmlDeclaration comment doctypeDeclaration
ouxmlDeclaration doctypeDeclaration comment
. La question n'a jamais parlé de mettre quoi que ce soit avant la xmlDeclaration.