2009-05-21 13 views
20

Voilà comment je créer une instance XStream pour XML:Comment désactiver pretty-printing (espace blanc/nouvelle ligne) dans XStream?

XStream xstream = new XStream(); 

Ceci est pour JSON:

private final XStream xstream = new XStream(new JsonHierarchicalStreamDriver() { 
     public HierarchicalStreamWriter createWriter(Writer writer) { 
      return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE); 
     } 
    }); 

Les deux sont assez d'impression (indenter) la sortie.

Comment puis-je demander au XStream de désactiver la jolie impression?

+0

Comment définir son propre graveur. pretty-Print Writer ne suffit pas à mes besoins. Je veux un retour à la ligne après chaque attribut et élément. Comment cela sera-t-il fait? http://stackoverflow.com/questions/8943000/format-xml-generated-by-xstream – Mady

Répondre

11

Avec l'aide de la communauté, j'ai compris la réponse.

Pour XML vous devez changer la manière dont vous sérialisez:

La ligne:

xStream.toXML(o, new OutputStreamWriter(stream, encoding)); 

changé à la ligne

xStream.marshal(o, new CompactWriter(new OutputStreamWriter(stream, encoding))); 

Pour JSON vous modifiez uniquement la façon dont le XStream est créé. Ainsi, l'initialisation du XStream est remplacé par:

private final XStream xstreamOut = new XStream(new JsonHierarchicalStreamDriver() { 
    public HierarchicalStreamWriter createWriter(Writer writer) { 
     return new JsonWriter(writer, new char[0], "", JsonWriter.DROP_ROOT_MODE); 
    } 
}); 

Notez que le constructeur JsonWriter 4 paramètre est utilisé.

+0

Comment définir son propre écrivain d'impression. pretty-Print Writer ne suffit pas à mes besoins. Je veux un retour à la ligne après chaque attribut et élément. Comment cela sera-t-il fait? – Mady

+0

Comment ajouter un prologue ou une feuille de style en utilisant CompactWriter? J'utilisais une nouvelle méthode d'écriture Writer(). Pour ajouter prolog et stylesheets, mais CompactWriter n'a pas cette fonction. – abi1964

4

Utilisez la méthode Marschal sur xstream avec un écrivain compact

xstream.marshal(someObject, new CompactWriter(out)); 
+1

Quelle est la différence entre "marshal" et "toXML"? Voici ce que j'utilise maintenant: xStream.toXML (o, nouveau OutputStreamWriter (stream, encoding)); – IgorM

+1

Apparemment, le CompactWriter ne fonctionne que pour XML. J'ai modifié ma commande pour la suivante et maintenant je reçois toujours du XML, même si j'ai besoin de JSON: xStream.marshal (o, nouveau CompactWriter (nouveau OutputStreamWriter (stream, encoding))); – IgorM

+0

Voir JavaDoc - toXML: sérialiser un objet en une chaîne XML assez imprimée. - marschal: sérialiser et s'opposer à une structure de données hiérarchique (telle que XML). Donc, avec Marshal, vous obtenez des options de sortie. Il n'y a pas de couture pour être une telle option pour JSON. – Mork0075

18

Merci, vos messages ont aidé !!! Voici ce que j'utilise pour convertir en une chaîne.

String strXML = ""; 
XStream xs = new XStream(); 
StringWriter sw = new StringWriter(); 
xs.marshal(this, new CompactWriter(sw)); 
strXML = sw.toString(); 
1

Le comportement par défaut de la jolie impression provient de la méthode AbstractXmlDriver.createWriter() (XStream utilise XppDriver comme pilote de flux hiérarchique par défaut, ce qui étend AbstractXmlDriver):

public HierarchicalStreamWriter createWriter(Writer out) { 
    return new PrettyPrintWriter(out, getNameCoder()); 
} 

Si vous voulez désactivez pretty-printing globalement (tout en conservant tous les autres comportements par défaut) et utilisez simplement la méthode toXML (o) simple plutôt que d'utiliser les autres options d'utilisation suggérées ici, vous pouvez initialiser votre instance XStream comme suit. Cela remplace la méthode ci-dessus avec un CompactWriter à la place.

XStream xstream = new XStream(new XppDriver() { 
    @Override 
    public HierarchicalStreamWriter createWriter(Writer out) { 
     return new CompactWriter(out, getNameCoder()); 
    } 
}); 
Questions connexes