xstream解析xml中有很多重复的field的xml
发布时间:2020-12-15 23:15:19 所属栏目:百科 来源:网络整理
导读:有些情况下,xml文件是这样的 body entryList field name="forumName"General Discussion/field field name="createDate"2013-09-11 12:37:02/field /entryList/body 对于这种xml使用xml解析工具解析是很好处理的,但是对xml绑定工具就不能直接绑定了。需要
有些情况下,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>标签了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |