如何利用dom4j生成XML文件!

此部分源码为最核心部分代码!

 

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();
 }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

apicescn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值