簡體   English   中英

從數據庫創建XML文件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM