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

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

Error. Page cannot be displayed. Please contact your service provider for more details. (5)


Парсинг XML с помощью SAX парсера

Поиск:
SAX - это событийный парсер для XML, т.е. он последовательно читает и рабирает данные из входного потока (это может быть файл, сетевое соединение, или любой другой InputStream). Когда парсер находит структурный элемент (открывающий тег, закрывающий тег, и т.п.), он оповещает об этом слушателя, и передает ему в качестве параметра найденый элемент. Слушатель делает все необходимые операции для данного элемента.

Работа с SAX выглядит так:

1. Создаем свой обработчик событий, наследуя его от базового класса DefaultHandler, и переопределяем в нем нужные нам методы. Пусть нам надо занести данные из всех элементов <user> в ArrayList.
Код
public class SAXHandler extends DefaultHandler
{
  private ArrayList<String> users;
  private boolean isUserTag = false;

  public String[] getUsers()
  {
    return users.toArray(new String[users.size()]);
  }

  @Override
  public void startDocument() throws SAXException
  {
    users = new ArrayList<String>();
  }

  @Override
  public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
  {
    isUserTag = "user".equals(qName);
  }

  @Override
  public void characters(char[] ch, int start, int length) throws SAXException
  {
    if(isUserTag)
      users.add(new String(ch, start, length));
  }

  @Override
  public void endElement(String uri, String localName, String qName) throws SAXException
  {
    isUserTag = false;
  }

  @Override
  public void endDocument() throws SAXException
  {
  }
}


2. Создаем фабрику парсеров и создаем парсер:
Код
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();


3. Парсим файл указав в качестве аргумента свой обработчик:
Код
SAXHandler handler = new SAXHandler();
parser.parse(new File("some.xml"), handler);


4. Если надо, можно указать парсеру, проверять документ по схеме:
Код
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(new File(""));

SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(false);
factory.setSchema(schema);

Примечание: это будет работать в JDK 1.5 и старше, в более младших версиях надо будет обновить JAXP.

Все вместе:
Берем такой файл:
Код
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <user>User 1</user>
  <userParam>Param 1</userParam>

  <user>User 2</user>
  <userParam>Param 2</userParam>

  <user>User 3</user>
  <userParam>Param 3</userParam>
</root>

Парсим его:
Код
public class SAXHandler extends DefaultHandler
{
  private ArrayList<String> users;
  private boolean isUserTag = false;

  public String[] getUsers()
  {
    return users.toArray(new String[users.size()]);
  }

  @Override
  public void startDocument() throws SAXException
  {
    users = new ArrayList<String>();
  }

  @Override
  public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
  {
    isUserTag = "user".equals(qName);
  }

  @Override
  public void characters(char[] ch, int start, int length) throws SAXException
  {
    if(isUserTag)
      users.add(new String(ch, start, length));
  }

  @Override
  public void endElement(String uri, String localName, String qName) throws SAXException
  {
    isUserTag = false;
  }

  @Override
  public void endDocument() throws SAXException
  {
  }

  public static void main(String[] args) throws Exception
  {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser parser = factory.newSAXParser();

    SAXHandler handler = new SAXHandler();
    parser.parse(new File("some.xml"), handler);

    for(String user : handler.getUsers())
      System.out.println("user = " + user);
  }
}

Получаем на выходе:
Код
user = User 1
user = User 2
user = User 3
 

Автор: LSD






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

 

 

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


Популярные:
  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. Проверить дубляжи в столбце


 

 

 
 
На главную