Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Генерация XML с помощью SAXTransformerFactory


Автор: LSD 10.8.2006, 14:05
Наиболее общий способ генерации 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>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)