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

1 篇文章 0 订阅

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);
 //以下省略...就是将文件传到前台

效果

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值