我有一个查询,当运行时返回一个结果集,其中包含所显示的顺序和分组中的以下数据:
Country Region Town
---------------------------------------
England North NewCastle
England North Manchester
England North Leeds
England South London
England South Bristol
England South Birmingham
England South Portsmouth
Norway North Trondheim
Norway North Tromso
Norway South Oslo
Norway South Stavanger
Norway West Bergen
使用Java,我想将返回的结果转换为XML文档,如下所示:
<countries>
<country>
<countryName>England</countryName>
<region name = "south">
<town>London</town>
<town>Bristol</town>
<town>Birmingham</town>
<town>Portsmouth</town>
</region>
<region name = "north">
<town>NewCastle</town>
<town>Leeds</town>
</region>
<country>
<country>
<countryName>Norway</countryName>
<region name = "south">
<town>Oslo</town>
<town>Stavanger</town>
</region>
<region name = "west">
<town>Bergen</town>
</region>
<region name = "North">
<town>Trondheim</town>
<town>Tromso</town>
</region>
<country>
<countries>
遍历数据的最佳方法是什么,以便在正确的位置创建和关闭标签?我在这里看到了一个例子http://www.mkyong.com/java/how-to-create-xml-file-in-java-jdom-parser/,但数据结构是扁平的,不像我使用的样本可能需要多个循环。
答案 0 :(得分:1)
通过更改在特定位置提及的属性
来检查此代码一次 package com.annexure.main;
import java.io.File;
import java.io.FileWriter;
import java.nio.file.FileAlreadyExistsException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.sun.org.apache.xerces.internal.dom.DocumentImpl;
import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
/* JDBC Classes*/
/* Java IO */
/* W3C Interfaces */
/* Xerces DOM Classes */
/* Xerces Serializer */
public class XmlMain {
public static final String JDBCURL = "oracle.jdbc.driver.OracleDriver";
public static final String JDBCDRIVER ="jdbc:oracle:thin:@localhost:1521:xe";
public static final String SQL = "select empid, empname, role from employee";
public static String OUTPUTFILE = "D:employee.xml";
//replace file with Country.xml
public static void main(String[] args) {
try{
/** Step 1 : Making a JDBC Connection with database" **/
Class.forName(JDBCURL) ;
Connection conn = DriverManager.getConnection(JDBCDRIVER,"system","root");
/** Step 2 : Retrieve the customer data from database **/
Statement statement = conn.createStatement();
ResultSet employeeRS = statement.executeQuery(SQL);
/** Step 3 : Build customer XML DOM **/
Document xmlDoc = buildEmployeeXML(employeeRS);
/** Step 4 : Write output to a file **/
File outputFile = new File(OUTPUTFILE);
printDOM(xmlDoc, outputFile);
conn.close(); /*Connection close*/
} catch(FileAlreadyExistsException f){
System.out.println("file alread present at this location");
}
catch(Exception e)
{
System.out.println("Really poor exception handling " +e.toString());
}
}//Main
/*Build XML DOcument from database. The XML object is returned to main method where it is written to flat file.*/
private static Document buildEmployeeXML(ResultSet _employeeRS) throws Exception
{
Document xmlDoc = new DocumentImpl();
/* Creating the root element */
//replace employeetable with countries to set a countries tag
Element rootElement = xmlDoc.createElement("EmployeeTable");
xmlDoc.appendChild(rootElement);
while(_employeeRS.next())
{
Element emp = xmlDoc.createElement("employee");
//replace employee with country for country tag
/* Build the CustomerId as a Attribute*/
emp.setAttribute("empid", _employeeRS.getString("empid"));
/* Creating elements within customer DOM*/
Element empName = xmlDoc.createElement("empname");
Element role = xmlDoc.createElement("role");
/* Populating Customer DOM with Data*/
empName.appendChild(xmlDoc.createTextNode(_employeeRS.getString("empname")));
role.appendChild(xmlDoc.createTextNode(_employeeRS.getString("role")));
/* Adding the empname and role elements to the employee Element*/
emp.appendChild(empName);
emp.appendChild(role);
/* Appending emp to the Root Class*/
rootElement.appendChild(emp);
}
return xmlDoc;
}
/* printDOM will write the contents of xml document passed onto it out to a file*/
private static void printDOM(Document _xmlDoc, File _outputFile) throws Exception
{
OutputFormat outputFormat = new OutputFormat("XML","UTF-8",true);
FileWriter fileWriter = new FileWriter(_outputFile);
XMLSerializer xmlSerializer = new XMLSerializer(fileWriter, outputFormat);
xmlSerializer.asDOMSerializer();
xmlSerializer.serialize(_xmlDoc.getDocumentElement());
}
}
答案 1 :(得分:0)
如果您不想解析xml,则使用字符串缓冲区动态构造XML。例如:
决定根不是,并迭代结果集
StringBuffer sb = new StringBuffer();
for(int i =0 ; i<size of your result set; i++)
sb.append("<CountryNamString>"+s.getString(0)+"<regionName>"+rs.getString(1)+"<townName>"+rs.getString(2)+"</townName>");
这只是一个例子。你可以改善这一点。