JAXB: Comment puis-je unmarshal XML sans espaces de noms
J'ai un fichier XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<object>
<str>the type</str>
<bool type="boolean">true</bool>
</object>
Et je veux unmarshal à un objet de la classe ci-dessous
@XmlRootElement(name="object")
public class Spec {
public String str;
public Object bool;
}
Comment puis-je faire cela? À moins que je spécifier les espaces de noms (voir ci-dessous), il ne fonctionne pas.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<object>
<str>the type</str>
<bool xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xsi:type="xs:boolean">true</bool>
</object>
OriginalL'auteur Andrey | 2011-08-25
Vous devez vous connecter pour publier un commentaire.
Un moyen plus simple serait d'utiliser unmarshalByDeclaredType, puisque vous connaissez déjà le type que vous souhaitez unmarshal.
En utilisant
vous n'avez pas besoin d'avoir une déclaration d'espace de noms dans le fichier XML, puisque vous passez dans le JAXBElement qui a l'espace de noms déjà.
Ce aussi parfaitement légal, puisque vous n'êtes pas obligé de faire référence à un espace de noms dans une instance XML, voir http://www.w3.org/TR/xmlschema-0/#PO - et de nombreux clients de produire du XML dans ce mode.
Enfin réussi à le faire fonctionner. Notez que vous devez supprimer tout espace de noms personnalisé dans le schéma; voici de travail exemple de code:
Le schéma:
XML:
JAXB code:
elementFormDefault="qualified")
. OK, l'espace de noms (ou, mieux le nom complet) de l'élément racine n'a pas d'importance. Mais est-il vrai pour les sous-éléments? Je ne le crois pas.Ne semble pas fonctionner pour moi. J'ai
<xsd:schema targetNamespace="http://www.foobar.com" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.foobar.com">
et unJAXBException
est levée.OriginalL'auteur Gregor
Mise à JOUR
Vous pouvez obtenir que cela fonctionne en introduisant une couche intermédiaire de traduire entre les
type
etxsi:type
. Ci-dessous est un exemple de l'utilisation de la StAXStreamReaderDelegate
pour ce faire, pour la JAXB unmarshal opération:xsi:type
est un schéma de mécanisme pour spécifier le type réel d'un élément (similaire à un casting en Java). Si vous supprimez l'espace de noms, vous sont en train de changer la sémantique du document.Dans EclipseLink JAXB (MOXy) nous vous permettent de spécifier votre propre succession indicateur pour le domaine des objets à l'aide
@XmlDescriminatorNode
et@XmlDescrimatorValue
. Actuellement, nous ne proposons pas ce type de personnalisation pour les propriétés de type de données:Vous pouvez faire ce travail, ci-dessous est une approche que l'on pourrait faire pour le unmarshal.
Salut Blaise. La suppression d'un espace de noms pour l'attribut "type" a très bien fonctionné, MERCI BEAUCOUP!!!, mais encore, comment puis-je supprimer "xs" déclaration d'espace de noms pour la valeur de l'attribut "type" - "xs:boolean". J'ai joué avec un substituant certains StreamReaderDelegate méthodes, mais sans succès.
Le code dans ma réponse juste les adresses de la unmarshal cas. Pour supprimer les espaces de noms du maréchal de fonctionnement, vous pouvez créer un wrapper pour un XMLStreamWriter qui intercepte et supprime pertinentes de l'espace de noms de l'info. Voici un lien vers une réponse que j'ai donné où j'ai fait quelque chose de similaire: stackoverflow.com/questions/5720501/...
Je suis en fait toujours parler de désordonnancement. (J'ai corrigé ma question de départ.) Fondamentalement, vous suggestion contribué à supprimer la déclaration d'espace de noms pour l'attribut "type", mais je ne peux pas comprendre comment faire pour supprimer déclaration d'espace de noms pour le "type" valeur de l'attribut lui-même. "xs:boolean" --> "boolean"
OriginalL'auteur bdoughan
Basé sur Blaise commentaires (merci Blaise!) et mes recherches.
Voici la solution à mon problème. Êtes-vous d'accord avec Blaise, ou vous avez une meilleure façon?
OriginalL'auteur Andrey