针对标签里面直接使用值的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属性去掉,如果只去掉某些类的这个多余的属性,用第一种方式即可。