XStreamで、XML→Java Object では、
XMLのリストの記述方法に左右される。
リストをラップするタグがない場合、
<?xml version="1.0" encoding="UTF-8"?> <items> <item> <id>101</id> <name>cell</name> </item> <item> <id>102</id> <name>mouse</name> </item> </items>
Java Object
package org.sample.element; import com.thoughtworks.xstream.annotations.XStreamAlias; import lombok.Data; /** * Parts */ @XStreamAlias("item") @Data public class Parts{ private int id; @XStreamAlias("name") private String itemName; }
List<T> へしか parse できない
XStream xstream = new XStream(); xstream.processAnnotations(Parts.class); xstream.alias("items", List.class); xstream.allowTypesByWildcard(new String[] { "org.sample.element.**", }); try{ Reader reader = getReader(this.getClass(), "test.xml"); List<Parts> partslist = (List<Parts>)xstream.fromXML(reader); // TODO }catch(IOException e){ e.printStackTrace(); }catch(URISyntaxException e){ e.printStackTrace(); }
Parts の List をもつ クラスObjectへ変換することを期待したいのである。
@Data public class Box{ private List<Parts> partslist; }
これを期待するならば、XMLが以下の様になっていないとならない。
<?xml version="1.0" encoding="UTF-8"?> <root> <list> <items> <item> <id>101</id> <name>cell</name> </item> <item> <id>102</id> <name>mouse</name> </item> </items> </list> </root>
list タグを itemタグ(Parts)のリストとして、
package org.sample.element; import java.util.List; import com.thoughtworks.xstream.annotations.XStreamAlias; import lombok.Data; /** * Box */ @XStreamAlias("root") @Data public class Box{ @XStreamAlias("list") private List<Parts> partslist; }
この Box クラスObjectへの変換になる。
XStream xstream = new XStream(); xstream.processAnnotations(Box.class); xstream.processAnnotations(Parts.class); xstream.alias("items", List.class); xstream.allowTypesByWildcard(new String[] { "org.sample.element.**", }); try{ Reader reader = getReader(this.getClass(), "test.xml"); Box box = (Box)xstream.fromXML(reader); // TODO }catch(IOException e){ e.printStackTrace(); }catch(URISyntaxException e){ e.printStackTrace(); }