2012-06-09 59 views
1

我有一個查詢,在運行時返回一個結果,在順序如下數據和分組顯示:隱蔽的數據庫表導致成XML - 如何生成一個XML文檔

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

我寧願嘗試將查詢結果導入到Java對象中,然後使用它們將它們序列化爲XML。 XStream的。 – Dzik

+0

將結果導入Java對象意味着什麼?你的意思是像JaxB? – ziggy

+0

是的,首先我會嘗試將查詢結果導入實體,然後使用JAXB序列化它們。如果這是您的案例的一個選項,它很好,很容易。 – Dzik

回答

0

如果你不想來解析XML,然後構造XML使用動態字符串buffer.For例如:

決定根沒有了,遍歷結果集

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>"); 

這只是一個例如,你可以改善這一點。

+0

該文檔太大且複雜,無法手動執行。 – ziggy

1

檢查該代碼一旦通過改變在特定位置

包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()); 
     } 

    }