Ich beginne gerade mit JAXB heute, und ich bin auf einer ungeraden Darstellung einer Liste von Datenelementen fest, wenn es nur einen Wert gibt. Beachten Sie, dass es für einzelne Werte von colors
eher als Element statt als Liste behandelt wird und nicht in einem -Tag eingeschlossen ist. Die Daten stammen von einer externen Quelle und ich habe keine Kontrolle über die Formatierung.JAXB Parsing Wrapper mit einem einzelnen Textelement anstelle von XmlElement
Wie kann JAXB mit beiden Darstellungen von colors
umgehen?
<?xml version="1.0" encoding="utf-8"?>
<widgets>
<widget>
<name>SingleValue</name>
<colors>Blue</colors>
</widget>
<widget>
<name>ListValues</name>
<colors>
<color>Red</color>
<color>Blue</color>
</colors>
</widget>
</widgets>
Ich habe mit Kombinationen von @XmlElementWrapper
verschiedene Versuche versucht und @XmlElement
, @XmlAnyElements
, @XmlElementRef(s)
und @XmlMixed
. Ich habe sogar eine Farbklasse erstellt und mehrere Zuordnungen zu Arrays und Strings ohne Glück versucht; Sie würden einzeln arbeiten, aber nicht, wenn sie gleichzeitig verwendet werden.
Mit dem obigen XML-Beispiel ist hier ein einfaches Programm, das "Blau" korrekt analysiert, wenn es in color
Tags verpackt wurde. Momentan gibt dieses Programm eine leere Liste für Farben zurück und kann "Blau" nicht aufnehmen.
@XmlRootElement(name = "widgets")
@XmlAccessorOrder(XmlAccessOrder.UNDEFINED)
public class Widgets {
private List<Widget> widgets = new ArrayList<Widget>();
public static void main(String[] args) {
File f = new File("C:\\aersmine\\AERS_KDR_Data", "widgets.xml");
try {
Widgets widgets = Widgets.load(f);
for (Widget widget : widgets.widgets) {
StringBuilder sb = new StringBuilder();
for (String color : widget.getColors()) {
if (sb.length() > 0)
sb.append(", ");
sb.append(color);
}
System.out.println("Widget " + widget.getName() + " Colors: " + sb.toString());
}
}
catch (Exception e) {
e.printStackTrace();
}
}
public static Widgets load(File file)
throws JAXBException, IOException {
FileInputStream is = new FileInputStream(file);
try {
JAXBContext ctx = JAXBContext.newInstance(Widgets.class);
Unmarshaller u = ctx.createUnmarshaller();
return (Widgets) u.unmarshal(is);
}
finally {
is.close();
}
}
@XmlElement(name="widget")
public List<Widget> getWidgets() {
return widgets;
}
public void setWidgets(List<Widget> widgets) {
this.widgets = widgets;
}
}
public class Widget {
public String n;
public List<String> cl = new ArrayList<String>();
@XmlElement(name="name")
public String getName() {
return n;
}
public void setName(String name) {
this.n = name;
}
@XmlElementWrapper(name="colors")
@XmlElement(name="color")
public List<String> getColors() {
return cl;
}
public void setColors(List<String> colors) {
this.cl = colors;
}
}
Vielen Dank für Ihre Hilfe.
Ich markiere dies als die Antwort in Anbetracht der Tatsache, dass ich noch nie eine vernünftige Lösung gefunden habe. In Anbetracht dessen, dass es keine anderen Kommentare oder Lösungen gegeben hat, kann ich daher nur annehmen, dass es keinen Standard gibt, mit schlechtem XML-Design mit jaxb umzugehen. Ich möchte immer noch eine bessere Lösung finden. Vielen Dank. – Scottt