12
votes

JAXB MAISHALS XML Différemment à SortrantStream vs StringWriter

Je m'excuse si cela a été répondu, mais les termes de recherche que j'ai utilisés (c'est-à-dire jaxb @xmlattribute condensé em> strong> ou Jaxb XML maréchal à String Différents résultats em> strong>) ne monte rien.

J'utilise Jaxb vers UN / MAILHAL Objets annotés avec @xmlelement @xmlattribute annotations. J'ai une classe de formatrice qui fournit deux méthodes - on entoure la méthode du maréchal et accepte l'objet au maréchal et à un sortiestream code>, l'autre accepte simplement l'objet et renvoie la sortie XML sous forme de chaîne. Malheureusement, ces méthodes ne fournissent pas la même sortie pour les mêmes objets. Lors du maréchalage vers un fichier, des champs d'objet simples marqués en interne avec @xmlattribute code> sont imprimés comme suit: p> xxx pré>

tandis que lors du maréchalage d'une chaîne, ils sont: P>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
<ns2:container xmlns:ns2="project/schema">  
    <number>1</number>  
    <word>stackoverflow</word>  
    <data value="This is internal"/>  
</ns2:container>


2 commentaires

Merci de le nettoyer un peu, j'ai eu des difficultés à ne pas avoir interprété le XML.


Une autre enquête a montré que ce que je recherche est la possibilité de contrôler si Jaxb écrit des "éléments vides" dans le style HTML (étiquettes appariées) ou XML (étiquette unique). Dans d'autres fournisseurs Jaxb comme Jaxme, il s'agit d'une propriété qui peut être définie, mais apparemment pas dans Jaxb. Je me demande simplement pourquoi il est différent en fonction du type de destination. Je sais qu'ils sont fonctionnellement équivalents, mais j'en ai besoin d'être identique au travail avec notre système. Des idées?


3 Réponses :


1
votes

Je ne sais pas pourquoi Jaxb fait cela - ou même s'il s'agit de Jaxb - si Jaxb émet une émission XML via SaxContHandler par exemple, il n'a pas de contrôle direct sur la manière dont les étiquettes de proximité sont produites.

Pour obtenir Comportement cohérent, vous pouvez envelopper votre sortie de sortie dans un débit de sortie, par exemple xxx

sur les mêmes lignes, vous pourriez voir ce qui se passe si vous enveloppez le StringWriter dans un imprimeur. Peut-être qu'il y a un code personnalisé qui détecte stritter pour essaie de garder la sortie courte que possible. Sonne peu probable, mais je n'ai aucune autre explication.


1 commentaires

J'ai fini par faire exactement cela avant de vérifier ici et de recevoir une sortie cohérente. Merci.



8
votes

On dirait que cela pourrait être un "bogue" dans Jaxb. En regardant la source, les appels de maréchal () Créez différents écrivains basés sur le paramètre de type de sortie / écrivain:

public void marshal(Object obj, OutputStream out, NamespaceContext inscopeNamespace) throws JAXBException {
    write(obj, createWriter(out), new StAXPostInitAction(inscopeNamespace,serializer));
}

public void marshal(Object obj, XMLStreamWriter writer) throws JAXBException {
    write(obj, XMLStreamWriterOutput.create(writer,context), new StAXPostInitAction(writer,serializer));
}


1 commentaires

Plus précisément, il s'agit d'un bogue dans la mise en œuvre du métro Jaxb. D'autres implémentations JAXB telles que Eclipselink Jaxb (Moxy) n'ont pas ce bogue.



2
votes

La bonne nouvelle est que Jaxb est une spécification avec plus d'une mise en œuvre (juste comme JPA). Si une mise en œuvre ne répond pas à vos besoins, d'autres sont disponibles, tels que Eclipselink Jaxb (Moxy):


1 commentaires

En effet, comme ce lien est maintenant défunt