La façon de traiter avec JAXB ComplexType avec MixedContent de données?
J'ai eu cette structure XML:
<Tax>
<Money currency="USD">0.00</Money>
<Description xml:lang="en">
17.5% Non-Recoverable
<ShortName>vatspecial</ShortName>
</Description>
</Tax>
Avis que Description
nœud a MixedContent
(composé avec du texte et XML) et c'est le XSD
partie concernant Description
nœud:
<xsd:complexType name="TaxDescriptionType">
<xsd:sequence>
<xsd:element name="ShortName" type="xsd:string" />
</xsd:sequence>
<xsd:attribute ref="xml:lang" />
</xsd:complexType>
Tout est ok à ce point, XJC
sorties, les classes générées comme celui-ci concernant TaxDescriptionType
:
package org.com.project;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
/**
* <p>Java class for TaxDescriptionType complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="TaxDescriptionType">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="ShortName" type="{http://www.w3.org/2001/XMLSchema}string"/>
* </sequence>
* <attribute ref="{http://www.w3.org/XML/1998/namespace}lang"/>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "TaxDescriptionType", propOrder = {
"shortName"
})
public class TaxDescriptionType {
@XmlElement(name = "ShortName", required = true)
protected String shortName;
@XmlAttribute(name = "lang", namespace = "http://www.w3.org/XML/1998/namespace")
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@XmlSchemaType(name = "NCName")
protected String lang;
/**
* Gets the value of the shortName property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getShortName() {
return shortName;
}
/**
* Sets the value of the shortName property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setShortName(String value) {
this.shortName = value;
}
/**
* Gets the value of the lang property.
*
* @return
* possible object is
* {@link String }
*
*/
public String getLang() {
return lang;
}
/**
* Sets the value of the lang property.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setLang(String value) {
this.lang = value;
}
}
Puis, avec ce qui précède class
je suis en mesure de travailler avec les éléments comme ceci:
taxDescriptionType.setLang("en");
taxDescriptionType.setShortName("vatspecial");
/* missing value: 17.5% Non-Recoverable */
Mais le problème est que je ne peux pas trouvé un moyen de get
ou set
la 17.5% Non-Recoverable
texte de la MixedContent-ComplexType
à partir de ci-dessus XML
exemple.
C'est ce que j'ai essayé et ça ne marche pas:
- Utilisé
mixed="true"
attribut comme ceci:
<xsd:complexType name="TaxDescriptionType" mixed="true">
(Je pense que XJC, c'est ignorer le dernier attribut)
Faisant quelques recherches, j'ai trouvé ceci:
JAXB XJC compilateur mépris mixte=true sur les documents de Schéma XML
Mais je ne suis pas sûr si c'est la manière de résoudre ce problème. Une des réponses a dit que c'est un bug et dans l'autre on montre un code qui transforme le MixedContent
dans un List<Serializable>
et peut-être la prochaine situation sera sur la façon de traiter ce:
taxDescriptionType.getContent().add(Serializable element);
(Et je ne sais vraiment pas comment traiter avec un Serializable
élément)
Vous devez vous connecter pour publier un commentaire.
Comme vous l'avez mentionné, vous devez ajouter les
mixed
attribut pour indiquer que le type prend en charge le contenu mixte. Sans cette spécifié votre contenu XML n'est pas valide:Générés
TaxDescriptionType
classe aura la propriété suivante. Essentiellement, cela signifie que tous les non-attribut contenu sera stocké dans unList
. Cela est nécessaire parce que vous avez besoin d'un mécanisme qui indique où le texte nœuds sont wrt le contenu de l'élément.Vous permettra de remplir cette liste avec les instances de
String
(représentant les nœuds de texte) etJAXBElement
(représentant le contenu d'un élément).SINON
Mixte en général, le contenu qui rend la vie plus compliquée qu'elle en a besoin. Si possible, j'aimerais recommander une autre représentation XML.
Ou
Serializable
paramètre de type deList
est-elle significative?Mixte=true, dans ObjectFactory il devrait y avoir une fonction comme
JAXBElement<ShortNameType> createTaxDescriptionTypeShortNameType(ShortNameType)
, ce qui génère le serializable élément pour vous.