9
votes

Comment ajouter un espace de noms XML (XMLNS) lors de la sérialisation d'un objet à XML

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: xxx

Comment puis-je atteindre exactement la sortie suivante avec Xstream? xxx


0 commentaires

3 Réponses :


16
votes

Xstream ne prend pas en charge les espaces de noms, mais le StaxDriver il utilise, fait. Vous devez définir les détails de votre espace de noms dans un qnamemap et transmettre cela dans le StaxDriver : xxx

sortie: xxx


3 commentaires

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 SetDefaultrefix , 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.



5
votes

Alternativement, ce cas d'utilisation pourrait être manipulé assez facilement avec une implémentation JAXB ( Metro , Eclipselink Moxy , Apache Jaxme , etc.):

domaine xxx

package-info < / p> xxx

Démo xxx

de la sortie < Pré> xxx

pour plus d'informations


0 commentaires

4
votes

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;
    }
}


0 commentaires