[英]Creating XML file from Database?
我有一個數據庫,db中有多個表。 現在,我想生成特定表或所有表的XML文件。 我嘗試了很多網上可用的東西,但無法做我想做的事情。 假設我有一個像這樣的表:
id created end_num gateway type modified name start_num sub_type
1 NULL 30 172.20.1.2 SIP NULL Bangalore 20 IP
2 NULL 15 172.20.2.5 SIP NULL Delhi 15 UDP
現在,我想生成以下XML文件:
<XYZ>
<users>
<user name="Bangalore" type="SIP">
<sub_type>IP</sub_type>
<start_num>20</start_num>
<end_num>30</end_num>
<gateway>172.20.1.2</gateway>
</user>
<user name="Delhi" type="SIP">
<sub_type>UDP</sub_type>
<start_num>15</start_num>
<end_num>15</end_num>
<gateway>172.20.2.5</gateway>
</user>
</users>
</XYZ>
注意:我需要從我的側面添加諸如<XYZ>和<Users>之類的標簽。
我正在嘗試執行以下操作:
@Transactional(readOnly=true)
public void getCommit() throws SQLException, ParserConfigurationException
{
System.out.println("INSIDE COMMIT REPO");
// TODO Auto-generated method stub
//String query = "FROM trunk";
SessionImpl sessionImpl = (SessionImpl)sessionFactory.getCurrentSession();
Connection connection = sessionImpl.connection();
PreparedStatement preparedStatement = connection.prepareStatement("Select * FROM trunk");
ResultSet rs = preparedStatement.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columnsNumber = rsmd.getColumnCount();
while (rs.next())
{
for (int i = 1; i <= columnsNumber; i++) {
if (i > 1) System.out.print(", ");
String columnValue = rs.getString(i);
System.out.print(columnValue + " ----------- " + rsmd.getColumnName(i));
}
System.out.println(" ");
}
toDoucumet(rs);
}
private Document toDoucumet(ResultSet rs) throws ParserConfigurationException, SQLException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
Element results = doc.createElement("Users");
doc.appendChild(results);
ResultSetMetaData rsmd = rs.getMetaData(); **// Getting Error at this line IllegalStateException**
int colCount = rsmd.getColumnCount();
System.out.println(colCount);
while(rs.next()){
Element row = doc.createElement("user");
results.appendChild(row);
for (int i = 1; i <= colCount; i++)
{
System.out.println(rsmd.getColumnName(i));
String columnName = rsmd.getColumnName(i);
Object value = rs.getObject(i);
Element node = doc.createElement(columnName);
node.appendChild(doc.createTextNode(value.toString()));
row.appendChild(node);
}
}
return doc;
}
請提供給我其他方法,以便從數據庫檢索數據后,我可以從自己的角度添加根標簽。 提前致謝.......
為什么不簡單地創建一個包含模板行的字符串,並用您的值替換占位符?
!! 偽代碼!
String template = "<user name=\"%userName%\" type=\"%userType%\"><sub_type>%subType%</sub_type><start_num>%start%</start_num><end_num>%end%</end_num><gateway>%gateway%</gateway></user>";
string result = "<XYZ><users>";
for (int i = 1; i <= colCount; i++) {
string user = template.replace("%userName%", valueOfColoumn("name"));
user = user.replace("%userType%", valueOfColoumn("type"));
...
result += user;
}
result += "</users></XYZ>";
有兩種選擇。 如果表很大,則首先創建XML文檔的成本很高。 最好遍歷SQL結果集,並為每條記錄編寫一個XML“記錄”。
然后,您選擇的XML標記與字段名稱相同。 您還可以選擇以下內容,這使得可以通過某些模式/ DTD驗證XML。
班加羅爾SIP IP
要轉儲表,可以使用SELECT * FROM table
,但是您也可以從連接中查詢DatabaseMetaData:所有表,列等。 您可以選擇事先不知道表名的情況。
對於您的方法,錯誤是ResultSet是作用域的,有點像Iterator。
try (PrintWriter xmlOut = ...) {
xmlOut.println("<?xml version="1.1"?>");
xmlOut.println("<db>");
String tableName = "trunk";
try (PreparedStatement preparedStatement = connection.prepareStatement("Select * FROM " + tableName);
ResultSet rs = preparedStatement.executeQuery()) {
ResultSetMetaData rsmd = rs.getMetaData();
int columnsNumber = rsmd.getColumnCount();
xmlOut.printf(" <%s>%n", tableName);
while (rs.next()) {
for (int i = 1; i <= columnsNumber; i++) {
String columnName = rsmd.getColumnLabel(i); // Or Name
String columnValue = rs.getString(i); // Check the type
xmlOut.printf(" <%s>%s</%s>%n",
columnLabel, columnValue, columnLabel);
}
}
xmlOut.printf(" </%s>%n", tableName);
} // Closes statement and result sets.
xmlOut.println("</db>");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.