* 加载xml字符串,转换为document对象
* @param strXML
* @return Document
* @throws DocumentException
*/
public static Document loadXML(String strXML) throws DocumentException{
StringReader strReader = new StringReader(strXML);
SAXReader reader = new SAXReader();
return reader.read(strReader);
}
/**
* 因为dom4j读取的在asXML时始终为UTF-8编码,需要用这种方式输出正确的编码
* @param document
* @param encoding
* @return
* @throws Exception
*/
public static String asXML(Document document,String encoding){
OutputFormat format = new OutputFormat();
format.setEncoding(encoding);
StringWriter stringWriter = new StringWriter();
XMLWriter writer = new XMLWriter(stringWriter,format);
try {
writer.write(document);
return stringWriter.toString();
} catch (IOException e) {
logger.error("asXML error",e);
}finally{
try {
writer.close();
} catch (IOException e) {
logger.error("asXML writer close error",e);
}
}
//发生异常,没办法,只能返回UTF-8的了
return document.asXML();
}
/**
* 创建document对象,包含接口和info
* <?xml version="1.0" encoding="[encoding]"?>
* @param encoding 字符串编码
* @return Document
*/
public static Document createDocument(String encoding){
Document document = DocumentHelper.createDocument();
document.setXMLEncoding(encoding);
return document;
}
/**
* 创建document对象,包含指定路径
* <?xml version="1.0" encoding="[encoding]"?>
* @param path 节点路径,如 body/Info
* 生成根节点为<body><Info></Info></body>
* @param encoding 字符串编码
* @return Document
*/
public static Element createElementByPath(String path,String encoding){
Document document = createDocument(encoding);
if(path == null || path.length == 0 || "null".equalsIgnoreCase(path)){
return null;
}
if(path.startWith("/")){ path = path.substring(1);}
String[] arr = path.split("/");
Element el = document.addElement(arr[0]);
for (int i = 1; i < arr.length; i++) {
el = el.addElement(arr[i]);
}
return el;
}
/**
* 通过document对象查找路径获取元素
* @param doc
* @param path /body/Info
* @return Element
*/
public static Element getSingleElement(Document doc,String path){
List<?> nodes=doc.selectNodes(path);
if(nodes.size() != 1){
return null;
}
return (Element) nodes.get(0);
}
/**
*xml字符串转json字符串
* @param xmlStr
* @return jsonString
*/
public static String xmlStr2Json(String xmlStr) throws JSONException{
JSONObject jsonObj = XML.toJSONObject(xmlStr);
if(jsonObj != null){
return jsonObj.toString();
}
return "";
}
/**
* 使用反射为Body添加数据节点,字段可设置生成节点或属性
* @param body
* @param obj 要添加进去的对象
* @param field2type 布尔值,false生成节点,忽略自身节点,true生成属性
*/
public static void addBodyElement(Element body,Object obj,boolean field2type) throws Exception{
Element recElement;
Field[] properties;
String fieldName;
Object fieldVal;
if(field2type){
recElement = body.addElement(obj.getClass().getSimpleName());
}else{
recElement = body;
}
properties = obj.getClass().getDeclaredFields();//获得实体类的所有属性
for (int i = 0; i < properties.length; i++) {
//反射get方法
Method meth = obj.getClass().getMethod(
"get"
+ properties[i].getName().substring(0, 1)
.toUpperCase()
+ properties[i].getName().substring(1)
);
//为二级节点添加属性,属性值为对应属性的值
fieldName = properties[i].getName();
fieldVal = meth.invoke(obj);
if(field2type){
recElement.addAttribute(fieldName,fieldVal == null ? Constants.EMPTY : fieldVal.toString());
}else{
recElement.addElement(fieldName).setText(fieldVal == null ? Constants.EMPTY : fieldVal.toString());
}
}
}
/**
* 使用反射为Body添加数据节点,字段可设置生成节点或属性
* @param body
* @param list 要添加进去的对象集合
* @param field2type 布尔值,false生成节点,true生成属性
*/
public static void addBodyElement(Element body,List<?> list,boolean field2type) throws Exception{
Element recElement;
Field[] properties;
String fieldName;
Object fieldVal;
if(list == null || list.size() == 0){
body.setText(Constants.EMPTY);
return;
}
for (Object obj : list) {
recElement = body.addElement(obj.getClass().getSimpleName());
properties = obj.getClass().getDeclaredFields();//获得实体类的所有属性
for (int i = 0; i < properties.length; i++) {
//反射get方法
Method meth = obj.getClass().getMethod(
"get"
+ properties[i].getName().substring(0, 1)
.toUpperCase()
+ properties[i].getName().substring(1)
);
//为二级节点添加属性,属性值为对应属性的值
fieldName = properties[i].getName();
fieldVal = meth.invoke(obj);
if(field2type){
recElement.addAttribute(fieldName,fieldVal == null ? Constants.EMPTY : fieldVal.toString());
}else{
recElement.addElement(fieldName).setText(fieldVal == null ? Constants.EMPTY : fieldVal.toString());
}
}
}
}
/**
* 将dom的节点转换为对象
* @param elList
* @param clazz
* @return
* @throws Exception
*/
public static Object Element2Bean(List<Element> elList, Class<?> clazz) throws Exception {
Object obj = clazz.newInstance();
if(elList == null || elList.size() == 0){
return obj;
}
String propertyName;
String val;
for (Element el : elList) {
propertyName = el.getName();
val = el.getTextTrim();
String setMethodName = "set"
+ propertyName.substring(0, 1).toUpperCase()
+ propertyName.substring(1);
clazz.getMethod(setMethodName,String.class).invoke(obj, val);
}
return obj;
}
/**
* 把doc中指定位置的元素替换
* @param oldEl
* @param doc
* @param targetPath
*/
public static void replaceElement(Element oldEl, Document doc, String targetPath){
Node oldNode = doc.selectSingleNode(targetPath);
List elepar = oldNode.getParent().content();
elepar.set(elepar.indexOf(oldNode),oldEl);
}