Java实现数据库数据生成XML文件的通用程序

转自http://tieba.baidu.com/p/136643159

原篇内容缺失,本篇对其进行整理,以备后用。

本篇使用w3c.dom解析。方法实现将查询结果集(ResultSet对象)和要生成的XML文件的路径传人,然后自己指派属性名称、元素名称并与对应的查询结果集中的字段对应,最后调用designOver()函数生成所期望的XML文件。

方法包含5个类:CreateXmlFile.java, XmlDisposal.java, SaveAttrName.java, SaveEleName.java, WriteXmlFile.java。

SaveAttrName.java:

public class SaveAttrName {
	private String attrName;
	private int index;
	public SaveAttrName(String attrName, int index) {
		super();
		this.attrName = attrName;
		this.index = index;
	}
	public String getAttrName() {
		return attrName;
	}
	public void setAttrName(String attrName) {
		this.attrName = attrName;
	}
	public int getIndex() {
		return index;
	}
	public void setIndex(int index) {
		this.index = index;
	}
	
}

SaveEleName.java:

public class SaveEleName {
	private String eleName;
	private int index;
	public SaveEleName(String eleName, int index) {
		super();
		this.eleName = eleName;
		this.index = index;
	}
	public String getEleName() {
		return eleName;
	}
	public void setEleName(String eleName) {
		this.eleName = eleName;
	}
	public int getIndex() {
		return index;
	}
	public void setIndex(int index) {
		this.index = index;
	}
	
}

XmlDisposal.java:

public class XmlDisposal {

	private ResultSet rs; //查询结果集 
	private String url; //要生成的xml文件的路径
	private ArrayList attrList = new ArrayList(); //用来存储属性名和字段索引的集合类 
	private ArrayList eleList = new ArrayList(); //用来存储元素名和字段索引的集合类
	private String root;
	private String rootChild;
	
	public void setResultSet(ResultSet rs, String url) {
		this.rs = rs;
		this.url = url;
	}
	
	public void setRootName(String root, String rootChild) {
		this.root = root;
		this.rootChild = rootChild;
	}
	
	public void collectData(String nameStr, int index, String type) {
		if(type.equals("attribute")) {
			attrList.add(new SaveAttrName(nameStr, index));
		} else {
			eleList.add(new SaveEleName(nameStr, index));
		}
	}
	
	public void startWrite() {
		new WriteXmlFile(attrList, eleList, rs, url).create(root, rootChild);
	}
}

WriteXmlFile.java:

public class WriteXmlFile {

	private ResultSet rs;
	private String url;
	private ArrayList arrtList;
	private ArrayList elemList;

	public WriteXmlFile(ArrayList arrtList,
			ArrayList elemList, ResultSet rs, String url) {
		super();
		this.rs = rs;
		this.url = url;
		this.arrtList = arrtList;
		this.elemList = elemList;
	}

	/**
	 * @param root xml文件的根元素名
	 * @param rootchild
	 */
	public void create(String root, String rootChild) {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		Document document = null;
		try {
			DocumentBuilder db = dbf.newDocumentBuilder();
			document = (Document) db.newDocument();
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Element rootElem = document.createElement(root);
		document.appendChild(rootElem);
		Iterator attr = arrtList.iterator();
		Iterator elem = elemList.iterator();
		try {
			while (rs.next()) {
				Element rootChildElem = document.createElement(rootChild);
				while (attr.hasNext()) {
					// 循环到属性集合中取元素名称,之后从查询结果集中取得数据,创建元素属性
					SaveAttrName temp = (SaveAttrName) attr.next();
					rootChildElem.setAttribute(temp.getAttrName(), rs
							.getString(temp.getIndex()).trim());
				}
				rootElem.appendChild(rootChildElem);
				while (elem.hasNext()) {
					// 循环到元素集合中取元素名称,之后从查询结果集中取得数据,创建结点
					SaveEleName temp = (SaveEleName) elem.next();
					Element tempElem = document
							.createElement(temp.getEleName());
					Text tempTextElem = document.createTextNode(rs.getString(
							temp.getIndex()).trim());
					tempElem.appendChild(tempTextElem);
					rootChildElem.appendChild(tempElem);
				}
				attr = arrtList.iterator(); // 重复循环到集合中取值
				elem = elemList.iterator(); // 重复循环到集合中取值
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		writeXml(document);
	}

	private void writeXml(Document doc) {
		try {
			FileOutputStream out = new FileOutputStream(url);
			OutputStreamWriter outWriter = new OutputStreamWriter(out);
			((XmlDocument) doc).write(outWriter, "UTF-8");
			outWriter.close();
			out.close();
			System.out.print("\nWrite xmlfile successful!\n");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

注明:XmlDocument这个类的使用需要引入crimson.jar


CreateXmlFile.java

public class CreateXmlFile {

	private ResultSet rs; //查询结果集     
	 private String url;  //要生成的xml文件的路径     
	private XmlDisposal disposal; //自定义的用来收集和处理数据的类
	private String root; //xml文件的根元素名称
	private String rootChild; //根结点的子结点的元素名称 
	public CreateXmlFile(ResultSet rs, String url) {
		super();
		this.rs = rs;
		this.url = url;
		disposal = new XmlDisposal();
		disposal.setResultSet(this.rs, this.url);
	}
	
	//设定xml文件的根元素名称
	public void setRootEleName(String root, String rootChild) {
		this.root = root;
		this.rootChild = rootChild;
		disposal.setRootName(this.root, this.rootChild);
	}
	
	//设置属性的名字和索引位置,位置从1开始
	public void serAttrName(String nameStr, int index) {
		disposal.collectData(nameStr, index, "attribute");
	}
	
	//设置元素的名字和索引位置,位置从1开始 
	public void setEleName(String nameStr, int index) {
		disposal.collectData(nameStr, index, "element");
	}
	
	public void designOver() {
		disposal.startWrite();
	}
}

测试类test.java

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Connection conn = DBUtil.getConnection();
		Statement stmt;
		try {
			stmt = conn.createStatement();
			ResultSet rs = stmt.executeQuery(DBUtil.getSql());
			/*int columnCount = rs.getMetaData().getColumnCount();
			while (rs.next()) {
				//rs.afterLast();
				//System.out.println(rs.getRow());
				for (int i = 1; i <= columnCount; i++) {
					System.out.print(rs.getObject(i) + "\t");	           
	                
				}
				
			}*/
			CreateXmlFile xml = new CreateXmlFile(rs, "d:/demo.xml");
			xml.setRootEleName("books","book"); 
			xml.serAttrName("title", 1);
                        //xml.setEleName("title", 1);
			xml.setEleName("author", 2);
			xml.setEleName("year", 3);
			xml.setEleName("price", 4);
			xml.designOver();
			rs.close();
			stmt.close();
			conn.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

在D盘根目录下生成demo.xml文件:

<?xml version="1.0" encoding="UTF-8"?>

<books>
  <book title="Harry Potter">
    <author>J K. Rowling</author>
    <year>2005-01-01</year>
    <price>30</price>
  </book>
  <book title="Everyday Italian">
    <author>Giada De Laurentiis</author>
    <year>2005-01-01</year>
    <price>30</price>
  </book>
  <book title="Learning XML">
    <author>Erik T. Ray</author>
    <year>2003-01-01</year>
    <price>40</price>
  </book>
  <book title="XQuery Kick Start">
    <author>James McGovern, Per Bothner</author>
    <year>2003-01-01</year>
    <price>50</price>
  </book>
</books>

数据库book表记录如下:

+-------------------+-----------------------------+------+-------+
| title             | author                      | year | price |
+-------------------+-----------------------------+------+-------+
| Harry Potter      | J K. Rowling                | 2005 | 30    |
| Everyday Italian  | Giada De Laurentiis         | 2005 | 30    |
| Learning XML      | Erik T. Ray                 | 2003 | 40    |
| XQuery Kick Start | James McGovern, Per Bothner | 2003 | 50    |
+-------------------+-----------------------------+------+-------+
4 rows in set




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值