SAX

Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Перейти к навигацииПерейти к поиску

SAX (англ. «Simple API for XML») — способ последовательного чтения/записи XML-файлов.

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

Реализации SAX-парсеров могут различаться, но в целом они устроены однотипно, примерно так как показано ниже: <source lang="cpp"> // ... На примере языка C++

// Поток документа struct Stream {

   virtual xml_char pop_char() = 0;
   virtual bool     has_data() = 0;

};

// Класс, которому парсер сообщает о найденных элементах разметки struct Callback {

   virtual void doc_start() = 0;
   virtual void doc_end() = 0;
   virtual void element_start( string el_name ) = 0;
   virtual void element_end( string el_name ) = 0;
   virtual void attribute( string name, string value ) = 0;
   virtual void text_node( string txt ) = 0;
   // ...

}

// Сам парсер. -- Довольно сложный, чтобы его тут полностью записать struct Parser {

   bool parse( Stream& xml, Callback& cb );
   // ... 

}; </source>

Использование: <source lang="cpp"> struct MyFileStream : Stream { ... }; struct MyCallback : Callback { ... };

MyFileStream _stream( "some_file.xml" ); MyCallback _cb;

Parser parser;

bool success = parser.parse( _stream, _cb );

// Например, "some_file.xml" содержит следующий текст: // <html lang="en"> // bold text // </html>

// Тогда парсер вызовет методы класса "Callback" в сдедующем порядке: // _cb.doc_start(); // _cb.element_start( "html" ); // _cb.attribute( "lang", "en" ); // _cb.element_start( "b" ); // _cb.text_node( "bold text" ); // _cb.element_end( "b" ); // _cb.element_end( "html" ); // _cb.doc_end(); </source>

Применяются SAХ-парсеры либо для быстрого поиска по ХML-документам, либо во время построения DOM, либо для чтения XML-потоков большого объема (когда построение DOM требует слишком большого объема памяти).

SAX - событийный парсер XML. Он содержит очень похожую модель обработки событий на такую же модель в Java. К примеру, в аплете Вы можете зарегистрировать обработчика события на клик мышкой, а в SAX Вы можете зарегистрировать обработчик события на начало и конец тегов элементов, таких как <name/> и </name>. В этом документе рассматривается XML парсер производства IBM. Он бесплатен и имеет общедоступные исходные тексты. Возьмём простой пример XML файла: <source lang="xml">

<?xml version="1.0" encoding="windows-1251"?>
<order>
  <item>
    <name>Soccer Ball</name>
    <price>15.00</price>
    <quantity>5</quantity>
  </item>
</order>

</source>

Параметр encoding="windows-1251" необходим для работы в кодировке Windows. Для разбора XML документа, используя SAX, мы осуществим несколько шагов. Эти шаги выделены в коде примера.

  • Регистрация парсера XML
  • Создание экземпляра XMLReader
  • Создание экземпляра класса отвечающего за обработку событий SAX-а
  • Подключение обработчика событий к экземпляру нашего XMLReader-а
  • Разбор документа посредством передачи XMLReader-у XML файла. (В этом примере используется файл "order.xml" содержащий XML код приведенный в начале статьи.)

В примере, наш класс расширит DefaultHandler. DefaultHandler это класс-адаптер, который позволит нам обрабатывать только те события SAX-а, которые нам нужны, а не реализовывать все его события. <source lang="java"> package xml;

import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler;

public class SimpleSax extends DefaultHandler {

 private String currentElement = null;
 public static void main(String[] args) {
   try {
     Class c = Class.forName("org.apache.xerces.parsers.SAXParser");
     XMLReader reader = (XMLReader)c.newInstance();
     SimpleSax ss = new SimpleSax();
     reader.setContentHandler(ss);
     reader.parse("order.xml");
   } catch(Exception e){System.out.println(e);}
 }
 public void startElement(String uri, String local_name, String raw_name, Attributes amap) throws SAXException {
   currentElement = local_name;
   System.out.println("start " + local_name + " found ");
 }
 public void endElement(String uri, String local_name, String raw_name) throws SAXException {
   System.out.println("end " + local_name + " found");
 }
 public void startDocument() throws SAXException {
  System.out.println("start document");
 }
 public void endDocument() throws SAXException {
  System.out.println("end document");
 }
 public void characters(char[] ch, int start, int length) throws SAXException {
  String value = new String(ch,start,length);
  if (!Character.isISOControl(value.charAt(0))) {
   System.out.println("characters " + value + " found " + currentElement);
  }
 }

} </source>

См. также

Литература

  • David Brownell, SAX2, O’Reilly, ISBN 0-596-00237-8
  • W. Scott Means, Michael A. Bodie: The Book of SAX, No Starch Press, ISBN 1-886411-77-8

Ссылки


Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....