用XStream转换复杂XML

针对标签里面直接使用值的xml,比如

 <IDS>
      <ID>1234534</ID>
      <ID>1111111111</ID>
    </IDS>

 

还有节点既有属性又有值的xml,比如

<INPUT>
  <RAW_SQL TYPE="PERSON">select id from person</RAW_SQL>
</INPUT>

需要一个转换器来转换,转换器代码如下:

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;
import com.zhhy.server.beans.RawSQL;

public class RawSQLConverter implements Converter {

 @SuppressWarnings("rawtypes")
 public boolean canConvert(Class clazz) {
  return clazz.equals(RawSQL.class);
 }

 public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext acontext) {
  RawSQL rawSQL = (RawSQL) value;
  if (rawSQL != null) {
   if (null != rawSQL.getType()) {
    writer.addAttribute("TYPE", rawSQL.getType());
   }
   writer.setValue(rawSQL.getRawSql() == null ? "" : rawSQL.getRawSql());
  }

 }

 public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext arg1) {
  RawSQL rawSql = new RawSQL();
  String type = reader.getAttribute("TYPE");
  rawSql.setType(type);

  String value = reader.getValue();

  rawSql.setRawSql(value);

  return rawSql;

 }

}
类的annotation配置如下:

@XStreamAlias("RAW_SQL")
@XStreamConverter(RawSQLConverter.class)
public class RawSQL {
 @XStreamAsAttribute
 @XStreamAlias("TYPE")
 private String type;

 private String rawSql;

 下面省略了getter和setter方法
}

 

 

后记:(2012-05-18日添加)

如果对象中定义的类型与实际类型不一致,比如定义的是Object类型,但是实际初始化的对象是其他类型,转换出来的xml文件都会加上class="实际类型"属性,举例:<PERSON class="PERSON">...</PERSON>

有两种方法去掉这个属性

1, xstream.alias("field name", Interface.class, ActualClassToUse.class);
2, xstream.aliasSystemAttribute(null, "class");

我选择用后面一种,这样会把所有class属性去掉,如果只去掉某些类的这个多余的属性,用第一种方式即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值