Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Генерация XML с помощью SAXTransformerFactory

Поиск:
Наиболее общий способ генерации 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: deborah.molina@thinktanksystems.au</NOTE>
  </ROW>
  <ROW>
    <ID>F84E28AEA58745CE874869314D57FAF8</ID>
    <FIRST_NAME>Johnnie</FIRST_NAME>
    <LAST_NAME>Saxon</LAST_NAME>
    <NOTE>e-mail: johnnie.s@alohanysystems.jp</NOTE>
  </ROW>
  <ROW>
    <ID>0DB3978C56F44FEDBFAF16A648DD2D25</ID>
    <FIRST_NAME>Bridget</FIRST_NAME>
    <LAST_NAME>Cooper</LAST_NAME>
    <NOTE>e-mail: bcooper@capital.li</NOTE>
  </ROW>
  <ROW>
    <ID>07F3FF7C5004446FB4B21134F02A9656</ID>
    <FIRST_NAME>Illeana</FIRST_NAME>
    <LAST_NAME>Lucien</LAST_NAME>
    <NOTE>e-mail: illeana.lucien@alternativetechnology.ch</NOTE>
  </ROW>
  <ROW>
    <ID>83569DAF4A5A43A3828069E2D2CF0692</ID>
    <FIRST_NAME>Austin</FIRST_NAME>
    <LAST_NAME>Washington</LAST_NAME>
    <NOTE>e-mail: austin.w@hardwoodwholesalers.com</NOTE>
  </ROW>
</ROWSET>
Автор: LSD






Просмотров: 2414

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную