3 votes

JAXB : un élément avec du contenu textuel et des attributs, générant des classes avec XJC

Récemment, j'ai été confronté à un problème qui semble être très courant : comment représenter un élément XML avec des attributs et un simple contenu textuel, comme ceci :

<elem attr="aval">elemval</elem>

en utilisant JAXB.

J'ai trouvé de nombreux conseils sur la façon de le faire, mais chacun de ces conseils implique une modification manuelle des classes de liaison.

Je dispose d'un ensemble de schémas et j'utilise XJC pour convertir ces schémas en classes Java. Cependant, il semble qu'il produise un code erroné, c'est-à-dire qu'il ne génère pas de méthodes pour définir le contenu brut, mais uniquement des méthodes pour définir les attributs.

Est-il possible de corriger ce comportement de XJC ? Une recherche approfondie sur Google n'a pas permis de répondre à cette question.

6voto

Blaise Doughan Points 75613

Vous trouverez ci-dessous un schéma XML qui définit la structure XML pour votre cas d'utilisation.

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/schema"
    xmlns:tns="http://www.example.org/schema" elementFormDefault="qualified">

    <element name="elem">
        <complexType>
            <simpleContent>
                <extension base="string">
                    <attribute name="attr" type="string" />
                </extension>
            </simpleContent>
        </complexType>
    </element>

</schema>

En générant un modèle JAXB à partir de ce schéma XML, on obtient la classe suivante :

package forum12859885;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlValue;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "value"
})
@XmlRootElement(name = "elem")
public class Elem {

    @XmlValue
    protected String value;
    @XmlAttribute(name = "attr")
    protected String attr;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getAttr() {
        return attr;
    }

    public void setAttr(String value) {
        this.attr = value;
    }

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X