DOM4J 操作 XML的工具类,自己写的,感觉还比较好用
来源:互联网 发布:淘宝进货货源 编辑:程序博客网 时间:2024/05/17 23:54
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;
}
}
- DOM4J 操作 XML的工具类,自己写的,感觉还比较好用
- 记录一些自己感觉好用的工具
- 自己写感觉比较好且使用的的函数 包括浏览目录以及 Slplit函数
- dom4j对xml比较完整的操作
- XML文件操作工具:Dom4j的使用(全而好的文章)(转)
- 感觉比较好用的调试宏
- JS Collection--javascript 集合类( 在使用Comet来进行数据交互时根据网上的资源写了几个集合类。自我感觉还比较好用,呵呵! )
- 自己写的文件操作工具类
- 想想还是用自己的博客写东西比较好
- 自己写一个好的PHP解析xml的类
- 个人感觉好用的sharedpreference工具类写法
- dom4j的xml操作
- xml的dom4j操作
- 自己写一个可用并且好用的Sqlite工具
- java io操作写的比较好
- dom4j解析xml,自己用的
- 基于Dom4j写的XML解析类
- DOM SAX JDOM DOM4J 操作XML的比较
- 在DataTable中求Max(字段)
- 微软 ESB 概要介绍
- Java 小例子:通过 Socket 发送和接收文件
- IBM借SVC“虚以应变”
- javamail做用户密码找回功能出现的问题解决结果。
- DOM4J 操作 XML的工具类,自己写的,感觉还比较好用
- 盘龙 十八章 上位神
- IT如何创造竞争优势
- information_schema.routines与sysobjects
- 处理一个form多个submit
- Windows Server 2003 系统配置方案
- IT硬汉缘何服“软”
- 盖茨给职场青年的十句警言
- LINUX kernel 导航