java对象数据转xml文件(加<![CDATA[]]>)[注解方式]
来源:互联网 发布:linux faikmm 编辑:程序博客网 时间:2024/05/29 17:54
java对象数据转xml文件
这种操作一般发生在导出文件,我在这里记录一下这一系列注解的使用,还有我遇到的问题及解决方法; 问题:对象属性中有可能存在计算逻辑'<'或'>',而在xml文件中这两个符号是不合法的,会转换为<和>,这样数据就'坏'了,所以<![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); //以下省略...就是将文件传到前台
- java对象数据转xml文件(加<![CDATA[]]>)[注解方式]
- JDOM 读取xml文件中的CDATA数据
- JAVA JDOM解析XML 带CDATA数据
- java注解生成xml和包含CDATA问题
- JAVA对象转换成XML(<![CDATA[文本内容]]>)
- JaxbContext生成xml文件或java类对象转化注解
- JaxbContext生成xml文件或java类对象转化注解
- Excel表格导出,java代码,采用反射加注解的方式获得excel表格中的数据
- 对象装xml中CDATA问题
- 处理 XML 数据:有效地使用 CDATA 区域
- xml节点含<![CDATA[]]>数据读取
- JAXB将JAVA对象转换为XML时CDATA的问题
- JAXB将JAVA对象转换为XML时CDATA的问题
- XML文件有关CDATA的使用方法
- Hibernate分别使用XML方式与注解方式添加数据
- XML CDATA
- XML CDATA
- XML CDATA
- HTML5--新增的标签、属性和事件
- Guitar Pro 7 注册机-注册码地址汇总
- 什么是REST和RESTful
- git 命令
- JS中对象的循环删除问题
- java对象数据转xml文件(加<![CDATA[]]>)[注解方式]
- Java线程的创建与启动(1)
- socket之基础讲解
- Centos7.3安装和配置jre1.8
- 在onCreate()中获取某个View的宽高(post()方法)
- oracle几种字符类型总结
- 测试博客第一篇
- DialogFragment使用及总结
- Centos7.3安装和配置Mysql5.7