import java.io.*;
import java.util.List;

import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;

/**
 * 这个类提供一些 JDom 对象常用的方法。
 *
 */
public class JDomUtil {

 /**
  * 根据指定路径的XML文件建立JDom对象
  *
  * @param filePath
  *            XML文件的路径
  * @return 返回建立的JDom对象,建立不成功返回null 。
  */
 public static Document buildFromFile(String filePath) {
  try {
   SAXBuilder builder = new SAXBuilder();
   Document anotherDocument = builder.build(new File(filePath));
   return anotherDocument;
  } catch (JDOMException e) {
   e.printStackTrace();
  } catch (NullPointerException e) {
   e.printStackTrace();
  } catch (IOException e) {
   // TODO 自动生成 catch 块
   e.printStackTrace();
  }
  return null;
 }

 /**
  * 根据XML 字符串 建立JDom对象
  *
  * @param xmlString
  *            XML格式的字符串
  * @return 返回建立的JDom对象,建立不成功返回null 。
  */
 public static Document buildFromXMLString(String xmlString) {
  try {
   SAXBuilder builder = new SAXBuilder();
   Document anotherDocument = builder
     .build(new StringReader(xmlString));
   return anotherDocument;
  } catch (JDOMException e) {
   e.printStackTrace();
  } catch (NullPointerException e) {
   e.printStackTrace();
  } catch (IOException e) {
   // TODO 自动生成 catch 块
   e.printStackTrace();
  }
  return null;
 }

 /**
  * 根据Dom对象建立JDom对象
  *
  * @param Dom
  *            org.w3c.dom.Document对象
  * @return 返回建立的JDom对象,建立不成功返回null 。
  */
 public static Document buildFromDom(org.w3c.dom.Document Dom)
   throws JDOMException, IOException {
  org.jdom.input.DOMBuilder builder = new org.jdom.input.DOMBuilder();
  Document jdomDoc = builder.build(Dom);
  return jdomDoc;
 }

 /**
  * 这个方法使用XMLOutputer将一个JDom对象输出到标准输出设备,使用 GBK 编码
  *
  * @param myDocument
  *            将要被输出的JDom对象
  */
 public static void outputToStdout(Document myDocument) {
  outputToStdout(myDocument, "GBK");
 }

 /**
  * 这个方法使用XMLOutputer将一个JDom对象输出到标准输出设备
  *
  * @param myDocument
  *            将要被输出的JDom对象
  * @param encoding
  *            输出使用的编码
  */
 public static void outputToStdout(Document myDocument, String encoding) {
  try {
/*   XMLOutputter outputter = new XMLOutputter();
   Format fm = Format.getRawFormat();
   fm.setEncoding(encoding);
   outputter.setFormat(fm);*/
   XMLOutputter outputter = new XMLOutputter("",true,encoding);
   outputter.output(myDocument, System.out);
  } catch (java.io.IOException e) {
   e.printStackTrace();
  }
 }

 /**
  * 这个方法将JDom对象转换字符串.
  *
  * @param document
  *            将要被转换的JDom对象
  */
 public static String outputToString(Document document) {
  return outputToString(document, "GBK");
 }

 /**
  * 这个方法将JDom对象转换字符串.
  *
  * @param document
  *            将要被转换的JDom对象
  * @param encoding
  *            输出字符串使用的编码
  */
 public static String outputToString(Document document, String encoding) {
  ByteArrayOutputStream byteRep = new ByteArrayOutputStream();
  /*   XMLOutputter outputter = new XMLOutputter();
  Format fm = Format.getRawFormat();
  fm.setEncoding(encoding);
  outputter.setFormat(fm);*/
  XMLOutputter outputter = new XMLOutputter("",true,encoding);
  try {
   outputter.output(document, byteRep);
  } catch (Exception e) {

  }

  return byteRep.toString();
 }

 /**
  * 这个方法将List对象转换字符串.
  *
  * @param document
  *            将要被转换的JDom对象
  */
 public static String outputToString(List list) {
  return outputToString(list, "GBK");
 }
 /**
  * 这个方法将List对象转换字符串.
  *
  * @param document
  *            将要被转换的JDom对象
  * @param encoding
  *            输出字符串使用的编码
  */
 public static String outputToString(List list, String encoding) {
  ByteArrayOutputStream byteRep = new ByteArrayOutputStream();
  /*   XMLOutputter outputter = new XMLOutputter();
  Format fm = Format.getRawFormat();
  fm.setEncoding(encoding);
  outputter.setFormat(fm);*/
  XMLOutputter outputter = new XMLOutputter("",true,encoding);
  try {
   outputter.output(list, byteRep);
  } catch (Exception e) {

  }

  return byteRep.toString();
 }
 public static org.w3c.dom.Document outputToDom(org.jdom.Document jdomDoc)
   throws JDOMException {
  org.jdom.output.DOMOutputter outputter = new org.jdom.output.DOMOutputter();
  return outputter.output(jdomDoc);
 }

 /**
  * 这个方法使用XMLOutputter将JDom对象输出到文件
  *
  * @param myDocument
  *            将要输出的JDom对象
  * @param filePath
  *            将要输出到的磁盘路径
  */
 public static void outputToFile(Document myDocument, String filePath) {
  outputToFile(myDocument, filePath, "GBK");
 }

 /**
  * 这个方法使用XMLOutputter将JDom对象输出到文件
  *
  * @param myDocument
  *            将要输出的JDom对象
  * @param filePath
  *            将要输出到的磁盘路径
  * @param encoding
  *            编码方式
  */
 public static void outputToFile(Document myDocument, String filePath,
   String encoding) {
  //setup this like outputDocument
  try {
   //XMLOutputter outputter = new XMLOutputter(" ", true,encoding);
   /*   XMLOutputter outputter = new XMLOutputter();
   Format fm = Format.getRawFormat();
   fm.setEncoding(encoding);
   outputter.setFormat(fm);*/
   XMLOutputter outputter = new XMLOutputter("",true,encoding);
   //output to a file
   FileWriter writer = new FileWriter(filePath);
   outputter.output(myDocument, writer);
   writer.close();

  } catch (java.io.IOException e) {
   e.printStackTrace();
  }
 }

 /**
  * 这个方法将JDom对象通过样式单转换.
  *
  * @param myDocument
  *            将要被转换的JDom对象
  * @param xslFilePath
  *            XSL文件的磁盘路径
  */
 public static void executeXSL(Document myDocument, String xslFilePath,
   StreamResult xmlResult) {
  try {
   TransformerFactory tFactory = TransformerFactory.newInstance();
   // Make the input sources for the XML and XSLT documents
   org.jdom.output.DOMOutputter outputter = new org.jdom.output.DOMOutputter();
   org.w3c.dom.Document domDocument = outputter.output(myDocument);
   javax.xml.transform.Source xmlSource = new javax.xml.transform.dom.DOMSource(
     domDocument);
   StreamSource xsltSource = new StreamSource(new FileInputStream(
     xslFilePath));
   //Get a XSLT transformer
   Transformer transformer = tFactory.newTransformer(xsltSource);
   //do the transform
   transformer.transform(xmlSource, xmlResult);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (TransformerConfigurationException e) {
   e.printStackTrace();
  } catch (TransformerException e) {
   e.printStackTrace();
  } catch (org.jdom.JDOMException e) {
   e.printStackTrace();
  }
 }

 //Main 函数,局部测试用。
 public static void main(String argv[]) {
//  Document dom = JDomUtil.buildFromFile("f:/web.xml");
//  List list=dom.getRootElement().getChildren("servlet");
//  String vs_dom = JDomUtil.outputToString(list,"gb2312");
//  System.out.println(vs_dom);
  String xmlString = "<record><row f1=\"111\" f2=\"111\"/><row f1=\"222\" f2=\"222\"/></record>";
  Document dom = JDomUtil.buildFromXMLString(xmlString);
  List list=dom.getRootElement().getChildren("row");
  int num = list.size();
  for(int i=0;i<num;i++){
   Element element = (Element)list.get(i);
   System.out.println(element.getAttributeValue("f1"));
   System.out.println(element.getAttributeValue("f2"));
  }
 }
}