Je suis des objets sérialisés à XML à l'aide de Xstream. Comment puis-je dire à Xstream d'insérer un XMLNS à la sortie XML de mon objet?
Comme exemple, j'ai cet objet simple que je veux sérialiser: p> Comment puis-je atteindre exactement em> la sortie suivante avec Xstream? p>
3 Réponses :
Xstream ne prend pas en charge les espaces de noms, mais le sortie: p> StaxDriver code >
il utilise, fait. Vous devez définir les détails de votre espace de noms dans un qnamemap code >
et transmettre cela dans le StaxDriver code>:
Nice, merci! Ok mais il y a encore un problème: je ne veux pas que le préfixe QEMU comme préfixe par défaut pour tous les nœuds. Il devrait simplement être défini à l'intérieur du nœud racine, de sorte que le XML résultant ressemble exactement à ma question. Avez-vous des indices comment y parvenir?
@ifischer Je ne pense pas qu'il y ait un moyen d'obtenir votre sortie exacte. Vous pouvez essayer de supprimer l'instruction code> SetDefaultrefix code>, mais qui supprimera également QEMU de la Déclaration XMLNS. Pourquoi avez-vous besoin de QEMU dans votre sortie si vous ne l'utilisez pas pour préfixer vos éléments?
Parce que tous les nœuds d'enfants n'utilisent pas l'espace de noms QEMU. De plus, peut-être que je souhaite ajouter plus d'espaces de noms XML plus tard. BTW, le XML généré doit être dans un format très spécifique, car il a été envoyé à Libvirt, qui est très strict.
Alternativement, ce cas d'utilisation pourrait être manipulé assez facilement avec une implémentation JAXB ( Metro , Eclipselink Moxy , Apache Jaxme , etc.):
domaine strong> p> package-info strong> < / p> Démo strong> p> pour plus d'informations forte> p>
Ceci est un peu de hack, mais c'est rapide et facile: ajoutez un champ à votre classe appelée xmlns code>, et ne l'avez-la que non-null pendant la sérialisation. Pour continuer votre exemple:
@XStreamAlias(value="domain")
public class Domain
{
@XStreamAsAttribute
private String type;
private String os;
(...)
@XStreamAsAttribute
@XStreamAlias("xmlns:qemu")
String xmlns;
public void serialise(File path) {
XStream xstream = new XStream(new DomDriver());
xstream.processAnnotations(Domain.class);
(...)
PrintWriter out = new PrintWriter(new FileWriter(path.toFile()));
xmlns = "http://libvirt.org/schemas/domain/qemu/1.0";
xstream.toXML(this, out);
xmlns = null;
}
}