package com.nhncorp.dcas.util;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import com.nhncorp.dcas.balance.XmlData;
/**
*
* Class Description
* <pre>
* Filename : DOM4JXMLOperator.java
* Date : 2009-1-22
* Creator : CN12666:liuqing
* Revised Description
* ----------------------------------------------
* ver revised date reviser revised contents
* ----------------------------------------------
* 1.0 2009-1-22 liuqing
*</pre>
*/
public class DOM4JXMLOperator {
private static Log log = LogFactory.getLog(DOM4JXMLOperator.class);
private String url; //文件地址
private Document document; //解析成的DOM对象
private Element root; //根节点
/**
*
* Method Description 根据文件地址打开XML文件,并且解析成DOM
*
* Creator : CN12666:liuqing
* @param url
*
* ----------------------------------------------
* ver revised date reviser revised contents
* ----------------------------------------------
* 1.0 2009-1-22 liuqing
*/
public void open(String url){
File doc = new File(url);
this.url = url;
SAXReader reader = new SAXReader();
try {
document = reader.read(doc);
//获得根节点
root = document.getRootElement();
} catch (DocumentException e) {
e.printStackTrace();
}
}
/**
*
* Method Description 得到XML文件编码
*
*
* Creator : CN12666:liuqing
* @return
*
* ----------------------------------------------
* ver revised date reviser revised contents
* ----------------------------------------------
* 1.0 2009-1-23 liuqing
*/
public String getXMLEncoding(){
log.debug(document.getXMLEncoding());
return document.getXMLEncoding();
}
/**
*
* Method Description 根据xpath找到的节点,添加子节点列表
*
* Creator : CN12666:liuqing
* @param o
* @param xPath
* @param typeName
*
* ----------------------------------------------
* ver revised date reviser revised contents
* ----------------------------------------------
* 1.0 2009-1-22 liuqing
*/
public void add(String xPath,List<Object> entries,String typeName){
for(Iterator<Object> i = entries.iterator();i.hasNext();){
add(i.next(),xPath,typeName);
}
}
/**
*
* Method Description 根据xpath找到的节点,添加子节点
*
* Creator : CN12666:liuqing
* @param o
* @param xPath
* @param typeName
*
* ----------------------------------------------
* ver revised date reviser revised contents
* ----------------------------------------------
* 1.0 2009-1-22 liuqing
*/
public void add(Object o,String xPath,String typeName){
Element el = interpretJavaBean(o, typeName);
for(Iterator<Object> i = find(xPath).iterator();i.hasNext();){
//如果实现添加element
//Node 和Element区别 node不一定是一个元素,但是元素一定是一个Node
//元素是含有一个小范围的定义,必须是包含完整信息的节点才是一个元素
//((Node)i.next()).add(element);
Node node = (Node)i.next();
if(node instanceof Element){
((Element)node).add(el);
}
}
}
/**
*
* Method Description 根据xpath查找节点列表
*
* Creator : CN12666:liuqing
* @param xPath
* @return
*
* ----------------------------------------------
* ver revised date reviser revised contents
* ----------------------------------------------
* 1.0 2009-1-22 liuqing
*/
public List<Object> find(String xPath){
List<Object> list = document.selectNodes(xPath);
return list;
}
/**
*
* Method Description 修改VALUE值为XML认可的空值
*
* Creator : jiangxu
* @param value
* @return
*
* ----------------------------------------------
* ver revised date reviser revised contents
* 1.0 2009-1-22 jiangxu Created this method
* ----------------------------------------------
*
*/
public String changeValue(String value){
if(value == null || value.equals("")){
value = "#N/A";
}
return value;
}
/**
*
* Method Description 根据XPath找到节点,并且删除该节点
*
* Creator : CN12666:liuqing
* @param xPath
*
* ----------------------------------------------
* ver revised date reviser revised contents
* ----------------------------------------------
* 1.0 2009-1-22 liuqing
*/
public void deleteChild(String xPath){
for(Iterator<Object> i = find(xPath).iterator();i.hasNext();){
Node node = (Node)i.next();
//Removes this node from its parent if there is one.
node.detach();
}
}
/**
*
* Method Description 找到子节点后,并且修改其 VALUE值
*
* Creator : CN12666:liuqing
* @param xPath
* @param value
*
* ----------------------------------------------
* ver revised date reviser revised contents
* ----------------------------------------------
* 1.0 2009-1-22 liuqing
*/
public void update(String xPath,String value){
value = this.changeValue(value);
for(Iterator<Object> i = find(xPath).iterator();i.hasNext();){
((Node)i.next()).setText(value);
}
}
/**
*
* Method Description 查找第i的实体以便修改其值
*
* Creator : CN12666:liuqing
*
* ----------------------------------------------
* ver revised date reviser revised contents
* ----------------------------------------------
* 1.0 2009-1-22 liuqing
*/
public void update(String xPath,String value,int i){
value = this.changeValue(value);
int k=0;
for(Iterator<Object> iter = find(xPath).iterator();iter.hasNext();){
Node node = (Node)iter.next();
if(i==k){
node.setText(value);
break;
}
k++;
}
}
/**
*
* Method Description 解析JAVABEAN成为XML实体
*
* Creator : jiangxu
* @param o
* @param xPath
* @param typeName
*
* ----------------------------------------------
* ver revised date reviser revised contents
* 1.0 2009-1-22 jiangxu Created this method
* ----------------------------------------------
*
*/
public Element interpretJavaBean(Object o,String typeName){
Class<? extends Object> clazz = o.getClass();
//创建Elment对象
Element element = DocumentHelper.createElement(typeName);
PropertyDescriptor [] props = null;
try {
props = Introspector.getBeanInfo(clazz).getPropertyDescriptors();
} catch (IntrospectionException e) {
e.printStackTrace();
}
for (PropertyDescriptor prop : props) {
try {
if(prop.getReadMethod().invoke(o) != null && !"class".equals(prop.getDisplayName())){
element.addAttribute(prop.getDisplayName(), prop.getReadMethod().invoke(o).toString());
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
return element;
}
/**
*
* Method Description 替换原有实体,如果有子实体则加入子实体
*
* Creator : liuqing
* @param o
* @param xPath
* @param typeName
* @param subO
*
* ----------------------------------------------
* ver revised date reviser revised contents
* 1.0 2009-1-22 jiangxu Created this method
* ----------------------------------------------
*
*/
public void replaceNode(Object o,String xPath,String typeName,Object subO){
Element parentElement = interpretJavaBean(o, typeName);
if(subO != null){
parentElement.add(interpretJavaBean(subO, typeName.substring(0,typeName.length()-1)));
}
for(Iterator<Object> iter = find(xPath).iterator();iter.hasNext();){
Node el = (Node)iter.next();
//node.getParentNode().replaceChild(element, node);
/*
* 获取父节点,并且遍历父节点的子节点,替换相应节点
*/
List list = el.getParent().content();
list.set(list.indexOf(el), parentElement);
el.getParent().setContent(list);
}
}
/**
*
* Method Description 保存修改后的XML
*
* Creator : CN12666:liuqing
*
* ----------------------------------------------
* ver revised date reviser revised contents
* ----------------------------------------------
* 1.0 2009-1-22 liuqing
*/
public void save(){
try {
/** 格式化输出,类型IE浏览一样 */
OutputFormat format = OutputFormat.createPrettyPrint();
/** 指定XML编码 */
format.setEncoding("UTF-8");
XMLWriter output=new XMLWriter(new FileOutputStream(url),format);
output.write(document);
output.close();
} catch (Exception exp) {
exp.printStackTrace();
}
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Document getDocument() {
return document;
}
public void setDocument(Document document) {
this.document = document;
}
}