今日はJAXBを使い始めたばかりです。値が1つしかない場合、データ要素のリストが奇妙に表示されます。 colors
という単一の値の場合は、リストの代わりに要素として扱われ、color
タグで囲まれていないことに注意してください。データは外部ソースから取得されており、書式設定を制御することはできません。JAXB XmlElementの代わりに単一テキスト要素を解析するラッパー
JAXBは、colors
の両方の表現をどのように扱うことができますか?
<?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>
私は@XmlElementWrapper
と@XmlElement
、@XmlAnyElements
、@XmlElementRef(s)
、および@XmlMixed
の組み合わせで様々な試みを試みました。私は色のクラスを作成し、配列や文字列に複数のマッピングを試みました。それらは個別に動作しますが、同時に使用される場合は動作しません。
上記のサンプルXMLを使用して、color
タグでラップされている場合、「青」を正しく解析する簡単なプログラムを次に示します。現在、このプログラムは空の色のリストを返すので、「青」をピックアップすることはできません。
@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;
}
}
ご協力いただきありがとうございます。
私は合理的な解決策を見つけたことがないと考えて答えをマークしています。他のコメントや解決策がないことを考えれば、私は、jaxbを使って貧弱なXML設計に対処する標準的な方法がないと仮定することができます。私はもっと良い解決策を探しています。ありがとう。 – Scottt