package com.vcredit.framework.utils;

import java.io.Writer;

import org.apache.commons.lang3.StringUtils;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
import com.thoughtworks.xstream.io.xml.XppDriver;

/**
* XML工具类
*/
public class XmlUtils {

/**
* 创建XStream
*/
private static XStream createXstream() {
XStream xstream = new XStream(new MyXppDriver(false));
xstream.autodetectAnnotations(true);
return xstream;
}

/**
* 支持注解转化XML
*/
public static String toXML(Object obj, Class<?> cls) {
if (obj == null) {
return null;
}
XStream xstream = createXstream();
xstream.processAnnotations(cls);
return getDefaultXMLHeader() + xstream.toXML(obj);
}

/**
* Object 转化 XML
*/
public static String toXML(Object obj) {
if (obj == null) {
return null;
}
XStream xstream = createXstream();
return getDefaultXMLHeader() + xstream.toXML(obj);
}

/**
* XML转化为JAVA对象
*/
@SuppressWarnings("unchecked")
public static <T> T xml2Obj(String xml, Class<?> cls) {
if (StringUtils.isBlank(xml)) {
return null;
}
XStream xstream = createXstream();
if (cls != null) {
xstream.processAnnotations(cls);
}
return (T) xstream.fromXML(xml);
}

/**
* XML转化为JAVA对象
*/
public static <T> T xml2Obj(String xml) {
return xml2Obj(xml, null);
}

private static String getDefaultXMLHeader() {
return "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
}

/**
*
* @description XppDriver
*
* @author lixining
* @version $Id: XmlUtils.java, v 0.1 2015年8月18日 上午9:46:57 lixining Exp $
*/
public static class MyXppDriver extends XppDriver {
boolean useCDATA = false;

MyXppDriver(boolean useCDATA) {
super(new XmlFriendlyNameCoder("__", "_"));
this.useCDATA = useCDATA;
}

@Override
public HierarchicalStreamWriter createWriter(Writer out) {
if (!useCDATA) {
return super.createWriter(out);
}
return new PrettyPrintWriter(out) {
boolean cdata = true;

@Override
public void startNode(String name, @SuppressWarnings("rawtypes") Class clazz) {
super.startNode(name, clazz);
}

@Override
protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write(cDATA(text));
} else {
writer.write(text);
}
}

private String cDATA(String text) {
return "<![CDATA[" + text + "]]>";
}
};
}
}
}

调用方法String xmlForMobileScore = XmlUtils.toXML(decisionReqForMobileScore);

再写到文件中:

String decisionReqName = getSaveFile(timestamp, modelName, "req");
String decisionResName = getSaveFile(timestamp, modelName, "res");
logger.info("DecisionClient->Request->" + timestamp + "->" + xml);
FileUtils.write(new File(decisionReqName), xml, "utf-8");

解析xml:dom4j

private DecisionResponse parseDecisionRespXML(String resultXml) throws BusinessException {
if (StringUtils.isBlank(resultXml)) {
throw new BusinessException("决策无数据返回");
}
DecisionResponse result = new DecisionResponse();
Element root = Dom4jUtils.getRoot(resultXml);
Element decisionResult = root.element("DecisionResult");
// 决策结果-建议拒绝 or 通过
Element resultElement = decisionResult.element("Result");
result.setResult(resultElement.getStringValue());

// 解析拒绝原因
if (!StringUtils.equals(result.getResult(), "通过")) {
Element ruleSetElement = decisionResult.element("RuleResultSets");
List<String> modList = parseRejectRules(decisionResult.element("RejectReasonList"));
parseRuleSet(result, ruleSetElement, modList);
}

// 解析决策评分卡结果
Element vbInfoSetElement = decisionResult.element("VBInfo");
parseVBInfoSet(result,vbInfoSetElement);

// 解析决策评分细节
Element ruleResultElement = decisionResult.element("RuleResultCanShowSets");
parseruleResult(result,ruleResultElement);

Element ruleResultCanShowSets = decisionResult.element("RuleResultCanShowSets");
parseRelatedRate(result, ruleResultCanShowSets);
logger.info("Decision Result -> " + GsonUtils.toJson(result));
return result;
}

package com.vcredit.framework.utils;

import org.apache.commons.lang3.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Dom4jUtils {
private static final Logger logger = LoggerFactory.getLogger(Dom4jUtils.class);

public static Document getDocument(String xml) {
Document document = null;
try {
document = DocumentHelper.parseText(xml);
if (document == null) {
throw new RuntimeException("document is null");
}
return document;
} catch (Exception e) {
logger.error("parse xml fail", e);
throw new RuntimeException("get document fail", e);
}
}

/**
* 解析XML获取Root节点
*
* @param xml
* @return Element
*/
public static Element getRoot(String xml) {
Document document = getDocument(xml);
return document.getRootElement();
}

/**
* 获取节点值
*
* @param root
* @param nodeName
* @return String
*/
public static String getValue(Element root, String nodeName) {
try {
if (root == null || StringUtils.isBlank(nodeName)) {
return null;
}
Element nodeElement = root.element(nodeName);
if (nodeElement == null) {
return null;
}
return nodeElement.getTextTrim();
} catch (Exception e) {
logger.error("get node(" + nodeName + ") value fail");
return null;
}
}

// public static void main(String[] args) throws IOException {
// Document doc = getDocument(FileUtils.readFileToString(new File("e:\\test\\result.xml"), "utf-8"));
// Element root = doc.getRootElement();
// List<Element> elementList = root.elements();
// for (Element element : elementList) {
// System.err.println("-------------------------->" + element.getName());
// System.err.println(element.getStringValue());
// }
// System.err.println("test");
// }
}

Xstream(对象和xml转换)的更多相关文章

  1. Java对象和XML转换

    有时候,我们需要把Java对象转换成XML文件.这时可以用JAXB来实现.(JDK1.6及以后的版本无需导入依赖包,因为已经包含在JDK里了) 假如某个公司有许多部门,每个部门有许多职员,我们可以这样 ...

  2. webservice04#对象与xml转换-jaxb#Stax解析xml#新建修改xml

    1,Student类 package com.yangw.xml; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement / ...

  3. 使用XStream是实现XML与Java对象的转换(3)--注解

    六.使用注解(Annotation) 总是使用XStream对象的别名方法和注册转换器,会让人感到非常的乏味,又会产生很多重复性代码,于是我们可以使用注解的方式来配置要序列化的POJO对象. 1,最基 ...

  4. 使用XStream注解实现Java对象与XML互相转换的代码示例

    本文记录一下使用xstream这个api的注解特性对Java对象与XML字符串相互转换的一些代码示例.    我们很多人都处理过XML文件,也有很多非常成熟的第三方开源软件.如:jdom.dom4j等 ...

  5. 使用XStream是实现XML与Java对象的转换(4)--转换器

    七.转换器(Converter) 我们程序中的POJO是千变万化的,而且需求也是千奇百怪的,所以XStream中的内置的转换器的功能不一定能够满足我们的要求,所以我们就需要自己构建转换器. 1,一个基 ...

  6. 使用XStream是实现XML与Java对象的转换(2)--别名

    五.使用别名(Alias) 首先,有这样一段Java代码: import java.util.ArrayList; import java.util.List; import com.thoughtw ...

  7. 使用XStream是实现XML与Java对象的转换(1)--简介及入门示例

    一.简单介绍 XStream是thoughtworks开发的开源框架,用于实现XML数据于Java对象.Json数据的转换.它不需要schema或其他的mapping文件就可以进行java对象和xml ...

  8. 使用XStream是实现XML与Java对象的转换(5)--Object Stream

    八,Object Stream 之前的例子我们都是直接输出Xml成为String类型或者从String中获得并解析Xml,现在我们要处理输入流和输出流! 1,输出流(ObjectOutputStrea ...

  9. Java对象表示方式2:XStream实现对对象的XML化

    上一篇文章讲到了使用Java原生的序列化的方式来表示一个对象.总结一下这种对象表示方式的优缺点: 1.纯粹的Java环境下这种方式可以很好地工作,因为它是Java自带的,也不需要第三方的Jar包的支持 ...

随机推荐

  1. Uva 839 Not so Mobile

    0.最后输出的yes no的大小写 1.注意 递归边界   一直到没有左右子树 即b1=b2=false的时候 才返回 是否 天平平衡. 2.注意重量是利用引用来传递的 #include <io ...

  2. 利用StringList对象来管理这些动态生成的对象

    如果程序需要动态创建大量的对象,那么我们可以利用StringList对象来管理这些动态生成的对象.1.创建StringList对象:OBJ := TStringList.Create; 2.保存动态生 ...

  3. UVa12298 Super Poker II(母函数 + FFT)

    题目 Source http://acm.hust.edu.cn/vjudge/problem/23590 Description I have a set of super poker cards, ...

  4. SQL SERVER 和ACCESS的数据导入导出

            //批量导入Access         string filepath = Server.MapPath("student.mdb");         stri ...

  5. Intellij IDEA常用快捷键——Mac版

    http://blog.csdn.net/longshen747/article/details/17204699 http://totohust.iteye.com/blog/1035550 设置自 ...

  6. 【SAP BusinessObjects】WEBI中的动态求和,累加函数的使用

    在WEBI中,提供了这样一个函数: RunningSum([字段名]) 其作用是,将[字段名]这一列进行累加动态求和 对于需要进行计算累加值的列就不必写复杂的SQL,直接使用此函数即可解决.

  7. [R语言]forecast.Arima中使用xreg报错

    问题: 使用forecast.Arima对带xreg的arima模型进行预测,报xreg Error pre.m4x <- forecast.Arima(m4x, h = 20, xreg = ...

  8. Ext中Grid重新load设置URL

    一.前言    Extjs中grid网格有时候需要重新加载,加载的时候对应不同的URL,什么情况出现:有需要我们在添加附件的时候,添加完成了附件,需要把另一个show添加的数据重新加载到grid中,而 ...

  9. H5 浏览器开发文档

    http://sja.co.uk/controlling-which-ios-keyboard-is-shown https://developer.apple.com/library/safari/ ...

  10. Android 实用开源控件

    图片放大缩小: PinchImageView 体验最好的图片手势控件,不同分辨率无缝切换,可与ViewPager结合使用. GestureViews 带有手势控制的ImageView和FrameLay ...