2

実行すると、次のデータが示されている順序とグループで結果セットを返すクエリがあります。

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/しかし、データの構造は、私が使用しているサンプルとは異なり、フラットです。おそらく複数のループが必要になります。

4

2 に答える 2

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

     } 
于 2017-02-13T07:21:52.050 に答える
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>");

これは一例です。これを改善できます。

于 2012-06-09T10:44:04.570 に答える