dom4j处理xml

/**
* 加载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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值