4 changed files with 237 additions and 41 deletions
@ -0,0 +1,172 @@ |
|||||
|
package com.epmet.util; |
||||
|
import com.google.common.collect.Lists; |
||||
|
import com.thoughtworks.xstream.XStream; |
||||
|
import com.thoughtworks.xstream.core.util.QuickWriter; |
||||
|
import com.thoughtworks.xstream.io.HierarchicalStreamWriter; |
||||
|
import com.thoughtworks.xstream.io.naming.NoNameCoder; |
||||
|
import com.thoughtworks.xstream.io.xml.CompactWriter; |
||||
|
import com.thoughtworks.xstream.io.xml.DomDriver; |
||||
|
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter; |
||||
|
import com.thoughtworks.xstream.io.xml.XppDriver; |
||||
|
|
||||
|
import java.io.StringWriter; |
||||
|
import java.io.Writer; |
||||
|
import java.nio.charset.StandardCharsets; |
||||
|
import java.util.List; |
||||
|
|
||||
|
public class XmlUtil { |
||||
|
|
||||
|
/** |
||||
|
* 转换不带CDDATA的XML |
||||
|
* |
||||
|
* @return |
||||
|
* @ |
||||
|
*/ |
||||
|
private static XStream getXStream() { |
||||
|
// 实例化XStream基本对象
|
||||
|
XStream xstream = new XStream(new DomDriver(StandardCharsets.UTF_8.name(), new NoNameCoder() { |
||||
|
// 不对特殊字符进行转换,避免出现重命名字段时的“双下划线”
|
||||
|
@Override |
||||
|
public String encodeNode(String name) { |
||||
|
return name; |
||||
|
} |
||||
|
})); |
||||
|
// 忽视XML与JAVABEAN转换时,XML中的字段在JAVABEAN中不存在的部分
|
||||
|
xstream.ignoreUnknownElements(); |
||||
|
return xstream; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 转换带CDDATA的XML |
||||
|
* |
||||
|
* @return |
||||
|
* @ |
||||
|
*/ |
||||
|
private static XStream getXStreamWithCData(List<String> ignoreCDATA) { |
||||
|
// 实例化XStream扩展对象
|
||||
|
XStream xstream = new XStream(new XppDriver() { |
||||
|
// 扩展xstream,使其支持CDATA块
|
||||
|
@Override |
||||
|
public HierarchicalStreamWriter createWriter(Writer out) { |
||||
|
return new PrettyPrintWriter(out) { |
||||
|
boolean cdata = true; |
||||
|
// 不对特殊字符进行转换,避免出现重命名字段时的“双下划线”
|
||||
|
@Override |
||||
|
public String encodeNode(String name) { |
||||
|
if(!ignoreCDATA.isEmpty()){ |
||||
|
for(String str:ignoreCDATA){ |
||||
|
if(str.equals(name)){ |
||||
|
cdata=false; |
||||
|
return name; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
cdata=true; |
||||
|
return name; |
||||
|
} |
||||
|
// 对xml节点的转换都增加CDATA标记
|
||||
|
@Override |
||||
|
protected void writeText(QuickWriter writer, String text) { |
||||
|
if (cdata) { |
||||
|
writer.write("<![CDATA["); |
||||
|
writer.write(text); |
||||
|
writer.write("]]>"); |
||||
|
} else { |
||||
|
writer.write(text); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
}; |
||||
|
} |
||||
|
}); |
||||
|
// 忽视XML与JAVABEAN转换时,XML中的字段在JAVABEAN中不存在的部分
|
||||
|
xstream.ignoreUnknownElements(); |
||||
|
return xstream; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 以压缩的方式输出XML |
||||
|
* |
||||
|
* @param obj |
||||
|
* @return |
||||
|
*/ |
||||
|
public static String toCompressXml(Object obj) { |
||||
|
XStream xstream = getXStream(); |
||||
|
StringWriter sw = new StringWriter(); |
||||
|
// 识别obj类中的注解
|
||||
|
xstream.processAnnotations(obj.getClass()); |
||||
|
// 设置JavaBean的类别名
|
||||
|
xstream.aliasType("xml", obj.getClass()); |
||||
|
xstream.marshal(obj, new CompactWriter(sw)); |
||||
|
return sw.toString(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 以格式化的方式输出XML |
||||
|
* |
||||
|
* @param obj |
||||
|
* @return |
||||
|
*/ |
||||
|
public static String toXml(Object obj) { |
||||
|
XStream xstream = getXStream(); |
||||
|
// 识别obj类中的注解
|
||||
|
xstream.processAnnotations(obj.getClass()); |
||||
|
// 设置JavaBean的类别名
|
||||
|
xstream.aliasType("xml", obj.getClass()); |
||||
|
return xstream.toXML(obj); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 转换成JavaBean |
||||
|
* |
||||
|
* @param xmlStr |
||||
|
* @param cls |
||||
|
* @return |
||||
|
*/ |
||||
|
@SuppressWarnings("unchecked") |
||||
|
public static <T> T toBean(String xmlStr, Class<T> cls) { |
||||
|
XStream xstream = getXStream(); |
||||
|
// 识别cls类中的注解
|
||||
|
xstream.processAnnotations(cls); |
||||
|
// 设置JavaBean的类别名
|
||||
|
xstream.aliasType("xml", cls); |
||||
|
T t = (T) xstream.fromXML(xmlStr); |
||||
|
return t; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 以格式化的方式输出XML |
||||
|
* |
||||
|
* @param obj |
||||
|
* @return |
||||
|
*/ |
||||
|
public static String toXmlWithCData(Object obj,List<String> ignoreCDAA) { |
||||
|
XStream xstream = getXStreamWithCData(ignoreCDAA); |
||||
|
// 识别obj类中的注解
|
||||
|
xstream.processAnnotations(obj.getClass()); |
||||
|
// 设置JavaBean的类别名
|
||||
|
xstream.aliasType("xml", obj.getClass()); |
||||
|
return xstream.toXML(obj); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 转换成JavaBean |
||||
|
* |
||||
|
* @param xmlStr |
||||
|
* @param cls |
||||
|
* @return |
||||
|
*/ |
||||
|
@SuppressWarnings("unchecked") |
||||
|
public static <T> T toBeanWithCData(String xmlStr, Class<T> cls) { |
||||
|
XStream xstream = getXStreamWithCData(null); |
||||
|
// 识别cls类中的注解
|
||||
|
xstream.processAnnotations(cls); |
||||
|
// 设置JavaBean的类别名
|
||||
|
xstream.alias("xml", cls); |
||||
|
T t = (T) xstream.fromXML(xmlStr); |
||||
|
return t; |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue