解答例 - 実習課題2 - 4.XML文書を作成する
(実習課題2)
DBよりあるテーブルのデータ一覧を取得し、XML文書にして表示するプログラムを作成しなさい。例えば、以下のようなテーブルがあったとします。
Table "customer"
Attribute | Type | Modifier
-----------+-----------------------+----------------------
c_num | character(4) | not null
c_name | character varying(40) | not null
address | character varying(20) | default 'Osaka city'
office | character(2) |
この場合、生成されるXML文書は以下のようになります。
<customer> <data> <c_num>1001</c_num> <c_name>Imada Kouchi</c_name> <address>Osaka city</address> <office>10</office> </data> <data> ... </data> </customer>
- ルート要素の名前はテーブル名
- 1行はdata要素で表す
- 各カラムのデータの値は,カラム名の要素の内容として出力する
- 使用するデータベース、テーブルは任意(Postgresql、Oracle)。
解答例
/** * DataBase2XML.java * * TECHSCORE Java XML DOM XSLT 4章 実習課題2 * * Copyright (c) 2004 Four-Dimensional Data, Inc. */ package com.techscore.dom.chapter4.exercise2; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; public class DataBase2XML { private static final String TABLE_NAME = "customer"; private static final String[] COLUMNS = {"c_num", "c_name", "address", "office"}; public static void main(String[] args) { Document document = null; try { document = DocumentBuilderFactory.newInstance() .newDocumentBuilder() .getDOMImplementation() .createDocument("", TABLE_NAME, null); } catch (Exception e) { e.printStackTrace(); System.exit(1); } Element root = document.getDocumentElement(); try { Class.forName("org.postgresql.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); System.exit(1); } Connection connection = null; try { connection = DriverManager.getConnection("jdbc:postgresql:Training", "postgres", ""); } catch (SQLException e) { e.printStackTrace(); System.exit(1); } StringBuffer sql = new StringBuffer(); sql.append("select " + COLUMNS[0]); for (int i = 1; i < COLUMNS.length; i++) { sql.append(","); sql.append(COLUMNS[i]); } sql.append(" from " + TABLE_NAME); try { Statement statement = connection.createStatement(); ResultSet result = statement.executeQuery(sql.toString()); while (result.next()) { Element data = document.createElement("data"); for (int i = 0; i < COLUMNS.length; i++) { Element element = document.createElement(COLUMNS[i]); element.appendChild(document.createTextNode(result.getString(i + 1))); data.appendChild(element); } root.appendChild(data); } result.close(); statement.close(); } catch (SQLException e) { e.printStackTrace(); System.exit(1); } finally { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); System.exit(1); } } try { Transformer transformer = TransformerFactory.newInstance() .newTransformer(); DOMSource source = new DOMSource(document); StreamResult result = new StreamResult(System.out); transformer.transform(source, result); } catch (TransformerConfigurationException e) { e.printStackTrace(); return; } catch (TransformerException e) { e.printStackTrace(); return; } } }
※ この解答例では、データベースに PostgreSQL を使用し、 SQL 6章1節の実習課題の販売管理データベースの customer テーブルを利用しています。