XSD zu Java mit JAXB: MAP <XSD: Element> mit XML: Lang to map <String, String> Verwenden Sie eine benutzerdefinierte BinJava

Java-Forum
Anonymous
 XSD zu Java mit JAXB: MAP <XSD: Element> mit XML: Lang to map <String, String> Verwenden Sie eine benutzerdefinierte Bin

Post by Anonymous »

Ich arbeite mit einem großen XSD -Schema mit vielen XSD: Element Einträge mit einem XML: Lang -attribut. Ich möchte JAXB mit einer benutzerdefinierten Bindung verwenden, um in den generierten Java -Klassen anstelle von einzelnen Klassen für jedes dieser Elemente eine Karte zu generieren.

Code: Select all


Example description

























< /code>
standardmäßig generiert JAXB für jedes solche Element eine separate statische Klasse: < /p>
package generated;

import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlAttribute;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlSchemaType;
import jakarta.xml.bind.annotation.XmlType;
import jakarta.xml.bind.annotation.XmlValue;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "TextileMaterialDetails", propOrder = {
"textileMaterialDescription",
"textileMaterialPercentage",
"textileMaterialThreadCount",
"textileMaterialWeight"
})
public class TextileMaterialDetails {

@XmlElement(required = true)
protected TextileMaterialDetails.TextileMaterialDescription textileMaterialDescription;
protected float textileMaterialPercentage;
@XmlElement(required = true)
protected TextileMaterialDetails.TextileMaterialThreadCount textileMaterialThreadCount;
@XmlElement(required = true)
protected QuantitativeValue textileMaterialWeight;
@XmlAttribute(name = "id")
@XmlSchemaType(name = "anyURI")
protected String id;

public TextileMaterialDetails.TextileMaterialDescription getTextileMaterialDescription() {
return textileMaterialDescription;
}
public void setTextileMaterialDescription(TextileMaterialDetails.TextileMaterialDescription value) {
this.textileMaterialDescription = value;
}
public float getTextileMaterialPercentage() {
return textileMaterialPercentage;
}
public void setTextileMaterialPercentage(float value) {
this.textileMaterialPercentage = value;
}
public TextileMaterialDetails.TextileMaterialThreadCount getTextileMaterialThreadCount() {
return textileMaterialThreadCount;
}
public void setTextileMaterialThreadCount(TextileMaterialDetails.TextileMaterialThreadCount value) {
this.textileMaterialThreadCount = value;
}
public QuantitativeValue getTextileMaterialWeight() {
return textileMaterialWeight;
}
public void setTextileMaterialWeight(QuantitativeValue value) {
this.textileMaterialWeight = value;
}
public String getId() {
return id;
}
public void setId(String value) {
this.id = value;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"value"
})
public static class TextileMaterialDescription {
@XmlValue
protected String value;
@XmlAttribute(name = "lang", namespace = "http://www.w3.org/XML/1998/namespace", required = true)
protected String lang;

public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getLang() {
return lang;
}
public void setLang(String value) {
this.lang = value;
}

}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"value"
})
public static class TextileMaterialThreadCount {

@XmlValue
protected String value;
@XmlAttribute(name = "lang", namespace = "http://www.w3.org/XML/1998/namespace", required = true)
protected String lang;

public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getLang() {
return lang;
}
public void setLang(String value) {
this.lang = value;
}
}

}
Was ich stattdessen möchte:
Für jedes solche XML: Lang -basierte Element möchte ich, dass JAXB eine Karte -wobei der Schlüssel der Sprachcode ist und der Wert der Wert ist. Dies: < /p>

Code: Select all

public class XmlLangMapAdapter extends XmlAdapter {

@Override
public Map unmarshal(Object v) throws Exception {
if (v == null) return Collections.emptyMap();

Method getValue = v.getClass().getMethod("getValue");
Method getLang = v.getClass().getMethod("getLang");

String value = (String) getValue.invoke(v);
String lang = (String) getLang.invoke(v);

Map map = new HashMap();
map.put(lang, value);
return map;
}

@Override
public Object marshal(Map map) throws Exception {
throw new UnsupportedOperationException("Marshalling is not supported.");
}
}
< /code>
Ich habe versucht, diesen Adapter über eine benutzerdefinierte JAXB -Bindungsdatei anzuwenden (custom-bindings.xjb
), aber es war mir nicht erfolgreich, es zu bewerben. Hier ist ein Beispiel meiner aktuellen .xjb -Datei (verwendet für Datumszuordnungen): < /p>

Code: Select all








Ich habe auch versucht, dies mit oder @xmljavatypeadapter zu erweitern, aber es konnte keinen Weg finden, den XML: Lang Code zu kartieren, um über Bindungen zu kartieren. Generierung: < /p>

Code: Select all



org.jvnet.jaxb
jaxb-maven-plugin
4.0.8



generate




${basedir}
${basedir}/src/main/resources/schema
custom-binding.xjb




Wie kann ich JAXB (über Bindungen oder anderweitig oder eine andere Alternative) konfigurieren, so dass ein XSD -Element mit XML: lang automatisch auf eine Karte in den generierten JAVA -Klassen zugeordnet wird, anstatt eine statische Klasse mit Wert und Lang zu generieren? /> Idealerweise suche ich nach einem generischen, wiederverwendbaren Ansatz, der über das gesamte Schema oder die XSD-Datei funktioniert, das verschiedene Arten von Elementen aufweist, keine statische oder hartcodierte Mapping für ein oder zwei Elemente. Plugins, Modellanpassung), um diese Art der Transformation zu erreichen?>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post