有些情况下,xml文件是这样的
<body> <entryList> <field name="forumName">General Discussion</field> <field name="createDate">2013-09-11 12:37:02</field> </entryList> </body>
对于这种xml使用xml解析工具解析是很好处理的,但是对xml绑定工具就不能直接绑定了。需要稍作修改。
如果使用xstream,就要添加一个转化器实现Converter接口。先把接口贴出来:
import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; public class FieldConverter implements Converter { @Override public boolean canConvert(@SuppressWarnings("rawtypes") Class type) { if (type == Field.class) { return true; } return false; } @Override public void marshal(Object source,HierarchicalStreamWriter writer,MarshallingContext context) { Field field = (Field)source; //writer.startNode("field"); writer.addAttribute("name",field.getName()); writer.setValue(field.getValue()); //writer.endNode(); } @Override public Object unmarshal(HierarchicalStreamReader reader,UnmarshallingContext context) { Field field = new Field(); String name = reader.getAttribute("name"); field.setName(name); String value = reader.getValue(); field.setValue(value); return field; } }下面是两个POJO封装类:
import java.util.List; public class Body { List<Field> entryList; public Body() { super(); } public List<Field> getEntryList() { return entryList; } public void setEntryList(List<Field> entryList) { this.entryList = entryList; } }
下面这个Filed类用来封装里面的field域,name对应name属性值,value对应filed的值。标准的做法应该要有一个<value>标签的。
public class Field { String name; String value; public Field() { super(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
下面的代码就是main方法,用来测试的:
import java.util.ArrayList; import java.util.List; import com.thoughtworks.xstream.XStream; public class TestXml { public static void main(String[] aa) { List<Field> entryList = new ArrayList<Field>(); Field field = new Field(); field.setName("forumName"); field.setValue("General Discussion"); entryList.add(field); Field field2 = new Field(); field2.setName("createDate"); field2.setValue("2013-09-11 12:37:02"); entryList.add(field2); Body body = new Body(); body.setEntryList(entryList); XStream xstream = new XStream(); xstream.registerConverter(new FieldConverter()); xstream.alias("field",Field.class); xstream.alias("body",Body.class); String xml = xstream.toXML(body); System.err.println(xml); Body body2 = (Body)xstream.fromXML(xml); System.out.println(body2); } }如果不使用FieldConverter,通过指定别名和属性,输出的xml value值是带有标签的,不符合规则。使用了就会输出带field的属性和值的,而value是直接作为field的值,不会在出现<value>标签了。