xstream 的高级用法,自定义输出结构

public static void main(String[] args) {
		XStream xstream = new XStream(new XppDriver() {
			public HierarchicalStreamWriter createWriter(Writer out) {
				return new PrettyPrintWriter(out) {
					boolean cdata = false;

					@Override
					public void startNode(String name, Class clazz) {
						super.startNode(name, clazz);
						cdata = (name.equals("converter") || name
								.equals("name"));
					}
					@Override
					protected void writeText(QuickWriter writer, String text) {
						if (cdata) {
							writer.write("<![CDATA[");
							writer.write(text);
							writer.write("]]>");
						} else {
							writer.write(text);
						}
					}
				};
			}
		});
//		 XppDriver xppDriver = new XppDriver(new XmlFriendlyReplacer(”__”, “_”)) {
//			public HierarchicalStreamWriter createWriter(Writer out){
//			return new PrettyPrintWriter(out,super.xmlFriendlyReplacer()) {
//			protected void writeText(QuickWriter writer,String text) {
//			writer.write(”<![CDATA[");
//			writer.write(text);
//			writer.write("]]>”);
//			}
//			};
//			}
//			};
//			XStream xStream = new XStream(xppDriver);
		xstream.registerConverter(new PersonConverter());
		xstream.alias("converter", Person.class);
		System.out.println(xstream.toXML(new Person("zzz","123","ssdsd"))); 
 package 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 PersonConverter implements Converter { 
 
        public boolean canConvert(Class clazz) { 
                return clazz.equals(Person.class); 
        } 
	    /**
		**Marshal方法是用来将对象转换为XML的,他有三个参数:
			1,我们准备转换的对象
			2,我们准备输出对象的writer
			3,当前的marshaling context
		*/
        @Override
        public void marshal(Object value, HierarchicalStreamWriter writer, 
                        MarshallingContext context) { 

                Person person = (Person) value; 
				//创建一个叫做fullname的节点,并将person的名字传给他
				//可以任意次数的调用start/end node方法,但需要记住,你必须在打开一个节点之后记住关闭它。
				//一般来说,执行转换的操作在setValue方法调用时发生
                writer.startNode("fullname"); 
                writer.setValue(person.getName()); 				
                writer.endNode(); 
                
                writer.startNode("age"); 
                writer.setValue(person.getAge()); 				
                writer.endNode(); 
        } 
        @Override
        public Object unmarshal(HierarchicalStreamReader reader, 
                        UnmarshallingContext context) { 
                Person person = new Person(); 
				//使用moveDown和moveUp方法在节点树层次中移动,所以,这里我们只需要简单的moveDown,得到值,再moveUp
                reader.moveDown(); 
                person.setName(reader.getValue()); 
                reader.moveUp(); 
                return person; 
        } 
}

  输出结果:

<converter>
  <fullname><![CDATA[zzz]]></fullname>
  <age><![CDATA[123]]></age>
</converter>
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值