java对象数据转xml文件(加<![CDATA[]]>)[注解方式]

来源:互联网 发布:linux faikmm 编辑:程序博客网 时间:2024/05/29 17:54

java对象数据转xml文件

    这种操作一般发生在导出文件,我在这里记录一下这一系列注解的使用,还有我遇到的问题及解决方法;    问题:对象属性中有可能存在计算逻辑'<'或'>',而在xml文件中这两个符号是不合法的,会转换为&lt和&gt,这样数据就'坏'了,所以<![CDATA[]]>的加入是非常有必要的!

需要导入类

1.这是在你需要导出的实体类中用到的(一般都是DTO[扩展类])
import java.io.Serializable;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
2.这是解决<,>两个符号自动转化的工具类用到的
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

注解的使用

1.@XmlRootElement,用于类级别的注解,对应xml的跟元素。通过name属性定义这个根节点的名称。
2.@XmlAccessorType,定义映射这个类中的何种类型都需要映射到xml。(如果不存在@XmlAccessorType,默认使用XmlAccessType.PUBLIC_MEMBER注解)
  参数:XmlAccessType.FIELD: java对象中的所有成员变量。
  XmlAccessType.PROPERTY:java对象中所有通过getter/setter方式访问的成员变量。
  XmlAccessType.PUBLIC_MEMBER:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量。
  XmlAccessType.NONE: java对象的所有属性都不映射为xml的元素。
3.@XmlAttribute,用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名。
4.@XmlElement,指定一个字段或get/set方法映射到xml的节点。通过name属性定义这个根节点的名称。
5.@XmlElementWrapper,为数组或集合定义一个父节点。通过name属性定义这个父节点的名称。

xml,javaBeen的相互装换

public class JaxbUtil{    /**     * 日志     */    private static final Log _logger = LogFactory.getLog (JaxbUtil.class);    public static String convertToXml (Object obj)    {        return convertToXml (obj, "UTF-8");    }    /**     * JavaBean转换成xml     *      * @param obj     * @param encoding     * @return     */    public static String convertToXml (Object obj, String encoding)    {        String result = null;        try        {            JAXBContext context = JAXBContext.newInstance (obj.getClass ());            Marshaller marshaller = context.createMarshaller ();            marshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, true);            marshaller.setProperty (Marshaller.JAXB_ENCODING, encoding);            StringWriter writer = new StringWriter ();            marshaller.marshal (obj, writer);            result = writer.toString ();        }        catch (Exception ex)        {            _logger.error (ex.getMessage (), ex);        }        return result;    }    /**     * xml转换成JavaBean     *      * @param xml     * @param c     * @return     */    @SuppressWarnings ("unchecked")    public static <T> T converyToJavaBean (String xml, Class <T> c)    {        T t = null;        try        {            JAXBContext context = JAXBContext.newInstance (c);            Unmarshaller unmarshaller = context.createUnmarshaller ();            t = (T) unmarshaller.unmarshal (new StringReader (xml));        }        catch (Exception ex)        {            _logger.error (ex.getMessage (), ex);        }        return t;    }}

解决保护数据问题的工具类

public class CDataAdapter extends XmlAdapter <String, String>{    @Override    public String marshal (String v) throws Exception    {        return "<![CDATA[" + v + "]]>";    }    @Override    public String unmarshal (String v) throws Exception    {        if ("<![CDATA[]]>".equals (v))        {            return "";        }        String v1 = null;        String v2 = null;        String subStart = "<![CDATA[";        int a = v.indexOf (subStart);        if (a >= 0)        {            v1 = v.substring (subStart.length (), v.length ());        }        else        {            return v;        }        String subEnd = "]]>";        int b = v1.indexOf (subEnd);        if (b >= 0)        {            v2 = v1.substring (0, b);        }        return v2;    }}

对应实例

定义类

@XmlAccessorType (XmlAccessType.FIELD)@XmlRootElement@XmlType (name = "indicatorDefine", propOrder ={ "indCode", "indDescs", "indTypeCode", "monTableName", "monTableDescs", "monTableFieldName", "monTableFieldDescs",  "validateType", "validateDescs", "validateScript", "validateMethod", "relateTable", "relateScript", "stabilityIdx",  "minValue", "maxValue", "enableStatus" })public class IndicatorDefineExportDto implements Serializable{    private static final long serialVersionUID = 4903249232957489027L;    @XmlElement (name = "indCode")    private String indCode;    @XmlElement (name = "indDescs")    private String indDescs;    @XmlElement (name = "indTypeCode")    private String indTypeCode;    @XmlElement (name = "monTableName")    private String monTableName;    @XmlElement (name = "monTableDescs")    private String monTableDescs;    @XmlElement (name = "monTableFieldName")    private String monTableFieldName;    @XmlElement (name = "monTableFieldDescs")    private String monTableFieldDescs;    @XmlElement (name = "validateType")    private String validateType;    @XmlElement (name = "validateDescs")    private String validateDescs;    @XmlJavaTypeAdapter (CDataAdapter.class)//这里是该属性需要加<![CDATA[]]>防止转换的注解    @XmlElement (name = "validateScript")    private String validateScript;    @XmlElement (name = "validateMethod")    private String validateMethod;    @XmlJavaTypeAdapter (CDataAdapter.class)//这里是该属性需要加<![CDATA[]]>防止转换的注解    @XmlElement (name = "relateTable")    private String relateTable;    @XmlElement (name = "relateScript")    private String relateScript;    @XmlElement (name = "stabilityIdx")    private String stabilityIdx;    @XmlElement (name = "minValue")    private String minValue;    @XmlElement (name = "maxValue")    private String maxValue;    @XmlElement (name = "enableStatus")    private String enableStatus;    //get,set方法省略    }@XmlAccessorType (XmlAccessType.FIELD)@XmlRootElement (name = "IndicatorDefineData")@XmlType (propOrder ={ "indicatorDefines" })public class IndicatorDefines implements Serializable{    /**     * serialVersionUID:TODO     *      * @since Ver 1.1     */    private static final long serialVersionUID = 3140176739363502638L;    @XmlElementWrapper (name = "indicatorDefines")    @XmlElement (name = "indicatorDefine")    private List <IndicatorDefineExportDto> indicatorDefines;

使用

List <IndicatorDefineExportDto> indicatorDefineExportDtos = new ArrayList <IndicatorDefineExportDto> ();IndicatorDefineExportDto indicatorDefineExportDto = new IndicatorDefineExportDto ();//省略查询数据操作//indicatorDefineInfos--查询到的数据 for (IndicatorDefine indicatorDefine : indicatorDefineInfos){ IndicatorDefineExportDto indicatorDefineExportDto = new IndicatorDefineExportDto (); //省略... //将indicatorDefine数据赋值到indicatorDefineExportDto 属性上 indicatorDefineExportDtos.add (indicatorDefineExportDto); } indicatorDefines.setIndicatorDefines (indicatorDefineExportDtos); //生成xml内容 String xmlContent = JaxbUtil.convertToXml (indicatorDefines); //以下省略...就是将文件传到前台

效果