xstream解析xml中有很多重复的field的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>标签了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


xml怎么加入图片路径
rss源错误怎么解决
文件后缀xml是什么意思
xml格式电子发票怎么获取
xml格式是什么意思
rss是什么意思啊
xml格式电子发票怎么打开
rss订阅源是什么意思
rss源是什么
xml注释怎么写
php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类