XStream List構造のXMLを読む

XStreamで、XMLJava 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();
}