Jaxb: comment unmarshall xs:XML-partie de chaîne?
J'ai une demande à faire XML<->conversions à l'aide de Jaxb généré automatiquement et classes avec maven-jaxb2-plugin.
Quelque part dans les profondeurs de mon schéma, j'ai la possibilité d'entrer "TOUT" xml.
Mise à jour: il décrit mieux mon schéma. Certains connus XML emballage totalement inconnu de la partie (le "tout" de la partie).
<xs:complexType name="MessageType">
<xs:sequence>
<xs:element name="XmlAnyPayload" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:any namespace="##any"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="OtherElements">
....
</xs:sequence>
Ce cartes (par jaxb) à un intérieur de classe comme ça.
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"any"
})
public static class XmlAnyPayload {
@XmlAnyElement(lax = true)
protected Object any;
Quand je unmarshall l'ensemble de la structure, il n'est pas un problème. L'Objet "tout" sera rendu dans un org.apache.xerces.dom.ElementNSImpl. Maintenant, je veux recréer l'objet Java manuellement puis passez au format XML. Comment dois-je prendre du hasard XML et de mettre dans le tout (org.apache.xerces.dom.ElementNSImpl) de l'élément à être en mesure de construire l'objet Java?
Également, le cas suivant est alors que j'ai cet élément comme java, je veux unmarshall cette partie (pour être en mesure d'extraire la chaîne XML de cet élément). Mais ce n'est pas possible. J'obtiens une exception sur les éléments racines. Mais il n'est pas possible d'annoter ElementNSImpl.
unable to marshal type "com.sun.org.apache.xerces.internal.dom.ElementNSImpl" as an element because it is missing an @XmlRootElement annotation
Avez-vous des suggestions sur la façon de traiter ces problèmes?
- Grâce à une bonne entrée dans ce domaine, j'ai réussi à résoudre ce problème. Une façon, j'ai collé avec mon nœud Dom. Juste ajouté un peu simple d'analyse XML pour obtenir les dom à partir de la chaîne. Dans l'autre sens, j'ai eu recours à travailler avec le XML DOM l'espace XPATH (sage), puisqu'il en fait m'a sauvé un peu de temps et les changements de contexte. XPATH est en fait très bon pour garder le code de la complexité vers le bas.
Vous devez vous connecter pour publier un commentaire.
@XmlAnyElement(lax = true)
signifie en clair quelque chose comme:C'est exactement ce qui se passe dans votre cas. Donc, si vous voulez réellement unmarshal le contenu de ce laxisme de tous, de fournir des JAXB contexte, avec une cartographie de l'élément que vous désirez unmarshal. La façon la plus simple pour ce faire est d'annoter votre classe avec
@XmlRootElement
Maintenant, lorsque vous créez votre JAXB contexte, ajouter
MyClass
en elle:Dans ce cas, si JAXB répond à la
{urn:bar}foo
élément à la place duxs:any
, il va savoir que cet élément est mappée surMyClass
et va essayer de unmarshal MyClass.Si vous êtes à la création de JAXB contexte basé sur le nom du package (vous n'avez probablement), vous pouvez toujours vous ajouter à la classe (par exemple,
com.acme.foo.MyClass
) à elle. La façon la plus simple est de créer uncom/acme/foo/jaxb.index
ressource:Et les ajouter votre nom de paquet pour le chemin de contexte:
Il y a d'autres façons avec
ObjectFactory
etc., mais le truc avecjaxb.index
est probablement le plus facile.Alternativement, au lieu de unmarshalling tout en un seul passage, vous pouvez laisser le contenu de
xs:any
que DOM et unmarshal dans l'objet cible dans un deuxième unmarshalling avec anothe JAXB contexte (qui connaissent votreMyClass
classe). Quelque chose comme:Cette approche est parfois mieux, surtout lorsque vous avez une combinaison de conteneur/charge utile schémas qui sont relativement indépendantes. Dépend du cas.
Tous dit ci-dessus s'applique à la formation des trains en tant que bien. C'est bien bidirectionnelle.
Je pense que vous avez besoin de la XSDs pour ce "tout" de la partie et de générer des classes pour eux aussi.
Voici quelques informations supplémentaires:
http://jaxb.java.net/guide/Mapping_of__xs_any___.html
Edit: si votre objet que vous souhaitez maréchal n'a pas le @XmlRootElement annotation (voir message d'erreur), alors je pense que vous avez de l'envelopper avec un JAXBElement.
nécessite quelques pas intuitif trucs à être converti en objet java. Si vous n'avez pas de différence, essayez d'utiliser