import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* xml边加载边读取:第一种读取方式
* @param file
* @throws Exception
*/
public static void XmlSAXReader(File file) throws Exception{
SAXReader reader = new SAXReader();
Document doc = reader.read(file);
Element root = doc.getRootElement();//xml 节点元素
List firstList = root.elements();//第二层节点元素 集合
System.out.println(firstList.size());
for (Iterator it = firstList.iterator(); it.hasNext();) {
Element secondelement = (Element) it.next();//第二层节点元素
List secondList = secondelement.elements();//第三层节点元素 集合
for (Iterator itsecond = secondList.iterator(); itsecond.hasNext();) {
Element thirdelement = (Element) itsecond.next();第三层节点
XmlSAXReaderNext( thirdelement );
}
}
}
public static int XmlSAXReaderNext(Element thirdelement ) {
//第四层节点元素集合
List forthList = thirdelement.elements();
System.out.println(forthList==null?"0":forthList.size());
for (Iterator it = forthList.iterator(); it .hasNext();) {
Element prop = (Element) it.next();//第四层节点元素
List<DefaultAttribute> l=prop.attributes();//获取节点属性
Iterator t= l.iterator();
while(t.hasNext()) {
DefaultAttribute de=(DefaultAttribute) t.next();
System.out.println(de.getName() + ":" + de.getData());/打印属性
}
List l=prop.elements();
System.out.println(l==null?"0":l.size());
System.out.println(prop.getName() + ":" + prop.getData());//打印节点名称和内容
}
System.out.println();
return 1;
}
/**
* 一次性读取xml文件中所有内容到内存: 第二种读取方式
*/
public static void readXml(String pathName,Connection conn,String preSql){
InputStream inputStream=null;
try{
//创建xml编辑对象
org.jdom.input.SAXBuilder saxBuilder = new org.jdom.input.SAXBuilder(false);
inputStream= new FileInputStream(new File(pathName));//创建文件输入流对象
org.xml.sax.InputSource inputSource = new org.xml.sax.InputSource(inputStream);//创建xml输入对象
org.jdom.Document document = saxBuilder.build(inputSource);//获取xml文档对象
org.jdom.Element rootElement = document.getRootElement();//获取xml根元素(一级节点)
// String tableId = rootElement.getAttributeValue("time").trim();//获取根属性
List<org.jdom.Element> rows = rootElement.getChildren("row");//获取子元素集合(二级节点)
org.jdom.Element row;
if(rows != null){
for(int m = 0;m<rows.size();m++){//遍历二级节点
row = rows.get(m);
List<org.jdom.Element> cols = row.getChildren("col");//获取三级节点集合
org.jdom.Element col;
if(cols != null){
for(int k = 3;k<cols.size();k++){
col = cols.get(k);
String value= col.getChildText("value").trim();
System.out.println("value:"+value);
}
}
}
}
inputStream.close();
}catch(Exception e){
try{
if(inputStream!=null)inputStream.close();
}catch(Exception e1){
e1.printStackTrace();
}
e.printStackTrace();
}
}
public static void closeWriteXml(org.dom4j.io.XMLWriter out ,OutputStreamWriter osw,FileOutputStream fos,Statement stmt,ResultSet rs ){
try{
if (out != null) out.close();
if (osw != null) osw.close();
if (fos != null) fos.close();
if (rs != null) rs.close();
if (stmt != null) stmt.close();
}catch(Exception e){
e.printStackTrace();
}
}
//Java实现xml文件数据写入
public static void writeXml(String path,Connection conn,String sql){
org.dom4j.Element row = null;
org.dom4j.io.XMLWriter out = null;
OutputStreamWriter osw = null;
FileOutputStream fos = null;
Statement stmt=null;
ResultSet rs =null;
try {
stmt=conn.createStatement();
rs = stmt.executeQuery(sql);//查询数据
File xmlFile = new File(path);// 指定xml文件全路径,不存在则生成,重复名称则覆盖
fos = new FileOutputStream(xmlFile);
osw = new OutputStreamWriter(fos, "UTF-8");// 指定编码,防止写中文乱码
// 输出格式化
org.dom4j.io.OutputFormat format = org.dom4j.io.OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
out = new org.dom4j.io.XMLWriter(fos, format);//创建xml输出对象
out.startDocument();
org.dom4j.Document document = org.dom4j.DocumentHelper.createDocument();//创建文档对象
// 添加元素 xml
org.dom4j.Element xmlElement = document.addElement("table");//增加文档根节点
xmlElement.addAttribute("time", new Date().getTime()+"");//增加根节点属性
out.writeOpen(xmlElement);//增加根节点到xml输出对象中
/**
* 加载数据
*/
if (rs != null) {
ResultSetMetaData md = rs.getMetaData(); // 循环结果集(rs)
while (rs.next()) {
row = org.dom4j.DocumentHelper.createElement("row");
for(int i=1;i<=md.getColumnCount();i++){
String columnName = md.getColumnName(i);
Object values = rs.getObject(columnName);
row.addAttribute(columnName, values != null ? values.toString() : "");
}
out.write(row);//增加二级节点到xml输出对象中
row.clearContent();
}
}
out.writeClose(xmlElement);
xmlElement.clearContent();
out.endDocument();
closeWriteXml( out , osw, fos, stmt, rs );
} catch (Exception e) {
closeWriteXml( out , osw, fos, stmt, rs );
e.printStackTrace();
}
}
注意:xml文件较大的时候,使用边加载边读取的方式,读取速度会明显加快