首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

用XStream变换复杂XML

2012-09-05 
用XStream转换复杂XML针对标签里面直接使用值的xml,比如?IDS????? ID1234534/ID????? ID111111111

用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属性去掉,如果只去掉某些类的这个多余的属性,用第一种方式即可。

热点排行