//很多时候,为了避免多次访问/查询数据库重的数据或者便于察看,将需要的数据一次取出并写入XML文件
//通过查询条件m_condition 按照xmlMapPath的模式/模板 将从库中的数据写到resultXml
//并返回记录条数
public int writeXML(String m_condtion,String xmlMapPath,String resultXml){
int recordNum=0;
String tableName = "table";
String tableCol = "*";
String sql = "select " + tableCol + " from " + tableName + " where " + m_condtion;
Document mapDoc = null;
Document dataDoc = null;
Document newDoc = null;
//开始预备工作
try {
DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
//Create the DocumentBuilder
DocumentBuilder docbuilder = dbfactory.newDocumentBuilder();
//Parse the file to create the Document
mapDoc = docbuilder.parse(xmlMapPath);
dataDoc = docbuilder.newDocument();
//Instantiate the new Document
newDoc = docbuilder.newDocument();
} catch (Exception e) {
System.out.println(e.getMassege());
}
//开始读取映射作用的template文件
Element mapRoot = mapDoc.getDocumentElement();
Node dataNode = mapRoot.getElementsByTagName("data").item(0);
Element dataElement = (Element)dataNode;
//Create a new element called "data"
Element dataRoot = dataDoc.createElement("data");
try {
/******** 这里创建一个连接conn,并创建statement
根据不同的数据源创建
********************************/
ResultSet resultset = stmt.query(sql);
//Get the ResultSet information
ResultSetMetaData resultmetadata = resultset.getMetaData();
int numCols = resultmetadata.getColumnCount();
Log.write("db_to_xml:numCols:" + numCols);
while (resultset.next()) {
//Create a new element called "row"
Element rowEl = dataDoc.createElement("row");
//为了便于浏览和读,创建列数,以id为标记
String colName = "id";
String colVal =Integer.toString(++recordNum);
Element dataEl = dataDoc.createElement(colName);
dataEl.appendChild(dataDoc.createTextNode(colVal));
rowEl.appendChild(dataEl);
for (int i=1; i <= numCols; i++) {
colName = resultmetadata.getColumnName(i);
//Get the column value
colVal = resultset.getString(i);
//Determine if the last column Accessed was null
if (resultset.wasNull()) {
colVal = "";
}
dataEl = dataDoc.createElement(colName);
dataEl.appendChild(dataDoc.createTextNode(colVal));
rowEl.appendChild(dataEl);
}
//Add the row to the root element
dataRoot.appendChild(rowEl);
}
} catch (Exception e) {
Log.write(e.getMessage());
} finally {
Log.write(" db_to_xml: Closing connections...");
}
//Add the root element to the document
dataDoc.appendChild(dataRoot);
Node node1= mapRoot.getElementsByTagName("root").item(0);
Element newRootInfo =(Element)node1;
Log.write("After got newRootInfo ...");
//Retrieve the root and row information
String newRootName = newRootInfo.getAttribute("name");
String newRowName= newRootInfo.getAttribute("rowName");
NodeList newNodesMap = mapRoot.getElementsByTagName("element");
//Create the final root element with the name from the mapping file
Element newRootElement=null;
newRootElement = newDoc.createElement(newRootName);
NodeList oldRows = dataRoot.getElementsByTagName("row");
for (int i=0; i < oldRows.getLength(); i++){
//Retrieve each row in turn
Element thisRow = (Element)oldRows.item(i);
//Create the new row
Element newRow = newDoc.createElement(newRowName);
for (int j=0; j < newNodesMap.getLength(); j++) {
//For each node in the new mapping, retrieve the information
//First the new information...
Element thisElement = (Element)newNodesMap.item(j);
String newElementName = thisElement.getAttribute("name");
//Then the old information
Element oldElement = (Element)thisElement.getElementsByTagName("content").item(0);
String oldField = oldElement.getFirstChild().getNodeValue();
//Get the original values based on the mapping information
Element oldValueElement = (Element)thisRow.getElementsByTagName(oldField).item(0);
String oldValue = oldValueElement.getFirstChild().getNodeValue();
Element newElement = newDoc.createElement(newElementName);
newElement.appendChild(newDoc.createTextNode(oldValue));
NodeList newAttributes = thisElement.getElementsByTagName("attribute");
for (int k=0; k < newAttributes.getLength(); k++) {
//Get the mapping information
Element thisAttribute = (Element)newAttributes.item(k);
String oldAttributeField = thisAttribute.getFirstChild().getNodeValue();
String newAttributeName = thisAttribute.getAttribute("name");
oldValueElement = (Element)thisRow.getElementsByTagName(oldAttributeField).item(0);
String oldAttributeValue = oldValueElement.getFirstChild().getNodeValue();
newElement.setAttribute(newAttributeName, oldAttributeValue);
}
//Add the new element to the new row
newRow.appendChild(newElement);
}
//Add the new row to the root
newRootElement.appendChild(newRow);
}
//Add the new root to the document
newDoc.appendChild(newRootElement);
//把生成的xml文档(newDoc)写到文件中(路径名为resultXml)
try{
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
Properties properties = transformer.getOutputProperties();
properties.setProperty(OutputKeys.ENCODING, "GB2312");//ISO8859_1,GB2312,UTF-8
properties.setProperty(OutputKeys.METHOD, "xml");
properties.setProperty(OutputKeys.VERSION, "1.0");
properties.setProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperties(properties);
DOMSource source = new DOMSource(newDoc);
StreamResult result = new StreamResult(new Java.io.File(resultXml));
transformer.transform(source, result);
//生成XML文件 完成
} catch (Exception e) {
System.out.println("XML file write:"+e.getMessage());
}
return recordNum;
}