Наиболее общий способ генерации XML - это постороить дерево DOM, а затем по нему получить XML. Этот споб хорош тем, что позволяет строить сложные документы, и предоставляет полный контроль над ситуацией. К недостаткам следует отнести, то что этот метод требует много памяти на хранение дерева и достаточно сложен.
Если надо генерировать XML достаточно большого объема, и при этом структура документа простая и единообразная, то удобно пользоваться SAXTransformerFactory. Порядок работы с ним следующий:- создаем Result. Например это может быть StreamResult для записи в OutputStream или файл, или это может быть DOMResult для генерации дерева DOM для дальнейшей обработки
- получаем TransformerHandler, именно он и будет получать команды о начале/конце документа или очередного элемента
- при желании можно получить экземпляр Transformer, для того чтобы установить некоторые параметры преобразования
Для примера выгрузим данные из таблицы БД в XML файл:
| Код | public static void printResultSet(ResultSet rs, TransformerHandler handler) throws SQLException, SAXException { ResultSetMetaData meta = rs.getMetaData(); String[] columns = new String[meta.getColumnCount()]; for(int i = 0; i < columns.length; i++) columns[i] = meta.getColumnName(i + 1); while(rs.next()) { handler.startElement(null, null, "ROW", null); for(int i = 0; i < columns.length; i++) { handler.startElement(null, null, columns[i], null); String str = rs.getString(i + 1); if(str != null) handler.characters(str.toCharArray(), 0, str.length()); handler.endElement(null, null, columns[i]); } handler.endElement(null, null, "ROW"); } }
public static void main(String[] args) { try { Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@server:1521:ORCL", "scott", "tiger"); PreparedStatement ps = conn.prepareStatement("select * from humans"); ResultSet rs = ps.executeQuery(); String tableName = rs.getMetaData().getTableName(1); if(tableName == null || tableName.equals("")) tableName = "ROWSET";
StreamResult out = new StreamResult(new File(tableName + ".xml")); SAXTransformerFactory tf = (SAXTransformerFactory) SAXTransformerFactory.newInstance(); TransformerHandler handler = tf.newTransformerHandler(); Transformer transformer = handler.getTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
handler.setResult(out); handler.startDocument();
handler.startElement("", "", tableName, null); printResultSet(rs, handler); handler.endElement("", "", tableName); handler.endDocument();
rs.close(); ps.close(); conn.close(); } catch(Exception ex) { ex.printStackTrace(); } } |
на выходе получим следующий XML:
| Код | <?xml version="1.0" encoding="UTF-8"?> <ROWSET> <ROW> <ID>003FF375D5E74B9D89F8D9CA253682E2</ID> <FIRST_NAME>Deborah</FIRST_NAME> <LAST_NAME>Molina</LAST_NAME> <NOTE>e-mail: [email protected]</NOTE> </ROW> <ROW> <ID>F84E28AEA58745CE874869314D57FAF8</ID> <FIRST_NAME>Johnnie</FIRST_NAME> <LAST_NAME>Saxon</LAST_NAME> <NOTE>e-mail: [email protected]</NOTE> </ROW> <ROW> <ID>0DB3978C56F44FEDBFAF16A648DD2D25</ID> <FIRST_NAME>Bridget</FIRST_NAME> <LAST_NAME>Cooper</LAST_NAME> <NOTE>e-mail: [email protected]</NOTE> </ROW> <ROW> <ID>07F3FF7C5004446FB4B21134F02A9656</ID> <FIRST_NAME>Illeana</FIRST_NAME> <LAST_NAME>Lucien</LAST_NAME> <NOTE>e-mail: [email protected]</NOTE> </ROW> <ROW> <ID>83569DAF4A5A43A3828069E2D2CF0692</ID> <FIRST_NAME>Austin</FIRST_NAME> <LAST_NAME>Washington</LAST_NAME> <NOTE>e-mail: [email protected]</NOTE> </ROW> </ROWSET> |
|