java对象数据转xml文件(加<![CDATA[]]>)[注解方式]
2017-09-11 16:56
543 查看
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[文本内容]]>)
- spring框架,可以没有spring.xml(即配置<beans>的文件吗?即不使用xml方式配置,而是只使用注解的方式配置
- 用java读取一个文件往hbase里插入数据(List<PUT>)
- XML文件中<return_code><![CDATA[SUCCESS]]></return_code>中CDATA的用法
- 序列化对象到Xml文件以及反序列话Xml文件到对象(序列化数据到8个Java原型类型)
- xml节点含<![CDATA[]]>数据读取
- 读取xml文件转成List<T>对象的两种方法
- mybatis的sql的xml的配置文件中<![CDATA[ ]]>的用法。
- xml文件数据和java对象互转
- groovy 直接将给定的文本转换成Java中的Class<?>对象从而不需要再手动去写.java文件
- SPRING IN ACTION 第4版笔记-第二章WIRING BEANS-008-在XML配置文件中引入JAVA配置文件 <import> 、<bean>
- 读取xml文件转成List<T>对象的两种方法
- Java解析txt文件中json数据到List<entity>,并存入数据库
- groovy 直接将给定的文本转换成Java中的Class<?>对象从而不需要再手动去写.java文件
- <七>AOP面向切面——配置bean.xml文件方式声明切面(附源码)
- (转) 读取xml文件转成List<T>对象的两种方法
- 读取xml文件转成List<T>对象的两种方法(附源码)
- 读取xml文件转成List<T>对象的两种方法(附源码)
- java-----将目标XML文件数据解析为单一对象
- java使用Xstream注解 解析xml文件 并将数据导入MySql数据库中