此部分源码为最核心部分代码!
package com.etong.allen;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.zip.CRC32;
import java.util.zip.CheckedInputStream;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import com.etong.common.util.StringUtils;
import com.roger.database.DBAction;
public class BaseXMLOperator {
/**
* 生成一个新的Document对象
* @return document
*/
protected Document createDocument() {
Document document = DocumentHelper.createDocument();
return document;
}
/**
* 创建一个新的Element对象
* @param paramName Element对象名称
* @param paramValue Element对象值
* @return element
*/
protected Element createElement(Document document, String paramName, String paramValue) {
if (paramValue != null) {
return document.addElement(paramName, paramValue);
} else {
return document.addElement(paramName);
}
}
/**
* 向XML文件中增加节点
* @param document 载入XML文件后获得的Document对象
* @param fatherElementId 要增加节点的父节点Id
* @param element 要增加的节点对象
*/
protected Element addElement(Element element, String titleName) {
return element.addElement(titleName);
}
/**
* 向XML文件中增加一个子节点--用于非递归循环
* @param conn 数据库链接
* @param sql SQL语句
* @param params SQL中的参数
* @param subelement Element子节点对象
* @throws SQLException
*/
protected boolean addOneSubElement(DBAction conn, String sql, ArrayList params, Element subelement) {
try {
ArrayList list = conn.queryDBToMap(sql, params);
addOneElement(subelement, list);
} catch (SQLException e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 向XML文件中子节点增加节点内容--用于非递归循环
* @param subelement Element子节点对象
* @param list SQL返回的数组对象
* @return
*/
protected void addOneElement(Element subelement, ArrayList list) {
Map map = (Map) (list.get(0));
addSubColumnText(subelement, map);
}
/**
* 向XML文件中增加一个子节点--用于递归循环
* @param conn 数据库链接
* @param sql SQL语句
* @param params SQL中的参数
* @param subelement Element子节点对象
* @param title 递归循环子节点的TiTle名称,用于创建循环子节点Element对象
* @return true-SQL执行成功 false-SQL执行失败
*/
protected boolean addLoopSubElement(DBAction conn, String sql, ArrayList params, Element subelement, String title) {
try {
ArrayList list = conn.queryDBToMap(sql, params);
addSubElement(subelement, list, title);
} catch (SQLException e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 用于向XML文件中增加一个循环子节点时,其循环子节点的Element对象
* @param subelement 向XML文件中增加的循环子节点的Element对象
* @param list SQL返回的ArrayList数组对象
* @param title 循环子节点对象中的Element对象Title名称
*/
protected void addSubElement(Element subelement, ArrayList list, String title) {
for (int j = 0; j < list.size(); j++) {
Element titleName = addElement(subelement, title);
Map map = (Map) (list.get(j));
addSubColumnText(titleName, map);
}
}
/**
* 设置Element对象子节点中的元素值
* @param subelement Element对象子节点对象
* @param map Map对象值(字段与字段值)
*/
protected void addSubColumnText(Element subelement, Map map) {
Set set = map.keySet();
for (Iterator iterator = set.iterator(); iterator.hasNext();) {
String columnName = (String) iterator.next();
subelement.addElement(columnName.toLowerCase()).addText(StringUtils.toWEB(map.get(columnName)));
}
}
/**
* 保存XML文件到指定的路径
* @param filePath 指定的XML文件存放路径
* @param document XML文件的Document对象
* @param isIndent 是否缩进
* @param isNewlines 是否换行
* @return true-保存成功 false-保存失败
*/
protected boolean saveFile(Document document, String filePath, boolean isIndent, boolean isNewlines) {
try {
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath), "GBK"));
OutputFormat xmlFormat = OutputFormat.createCompactFormat();// 缩减格式
xmlFormat.setEncoding("GBK");// 设置文件编码
if (isIndent) {
xmlFormat.setIndent(" ");// 缩进符号
}
if (isNewlines) {
xmlFormat.setNewlines(true);// 是否产生新行
}
XMLWriter xmlWriter = new XMLWriter(out, xmlFormat);
xmlWriter.write(document); // 输出XML文档
out.flush();
xmlWriter.close();
} catch (IOException e) {
System.out.println("文件没有找到");
e.printStackTrace();
return false;
}
return true;
}
/**
*
* @param file 文件路径对象
* @return 返回CRC32算法代码
* @throws IOException
*/
public static String getFileCRCCode(File file) throws IOException {
FileInputStream fileInputStream = new FileInputStream(file);
return getStreamCRCCode(fileInputStream);
}
/**
*
* @param input 文件路径对象
* @return 返回CRC码值
* @throws IOException
*/
public static String getStreamCRCCode(InputStream input) throws IOException {
CRC32 crc32 = new CRC32();
for (CheckedInputStream checkedinputstream = new CheckedInputStream(input, crc32); checkedinputstream.read() != -1;)
;
return Long.toHexString(crc32.getValue()).toUpperCase();
}
/**
*
* @param file 文件路径
* @return 返回CRC32码值字符串
* @throws IOException
*/
public static String getFileCRCCode(String file) throws IOException {
return getFileCRCCode(new File(file));
}
/**
* 过滤字符串,防止XML文件中出现非法字符
* @param sourceString 要过滤的字符串
* @return 过滤后的字符串
*/
protected String formatTextForXML(String sourceString) {
if (sourceString == null) {
return null;
}
int strLen = 0;
StringBuffer reString = new StringBuffer();
String deString = "";
strLen = sourceString.length();
for (int i = 0; i < strLen; i++) {
char ch = sourceString.charAt(i);
switch (ch) {
case '<':
deString = "<";
break;
case '>':
deString = ">";
break;
case '"':
deString = "/"";
break;
case '&':
deString = "&";
break;
case 13:
deString = "n";
break;
default:
deString = "" + ch;
}
reString.append(deString);
}
return reString.toString();
}
}