Sax

Sax

SAX (англ. «Simple API for XML») — способ последовательного чтения/записи парсеры требуют фиксированного количества памяти для своей работы, но не позволяют изменять содержимое документа. Всё, что делает SAX-парсер, это сообщает вызвавшему приложению о встреченных распознанных элементах XML-разметки или о встреченных ошибках. Связь парсера с вызывающим приложением, как правило, осуществляется посредством функций обратного вызова.

Реализации SAX-парсеров могут различаться, но в целом они устроены однотипно, примерно так как показано ниже:

// ... На примере языка 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 );
    // ... 
};

Использование:

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">
//   <b>bold text</b>
// </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();

Применяются SAХ-парсеры либо для быстрого поиска по ХML-документам, либо во время построения

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

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

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

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

В примере, наш класс расширит DefaultHandler. DefaultHandler это класс-адаптер, который позволит нам обрабатывать только те события SAX-а, которые нам нужны, а не реализовывать все его события.

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);
   }
  }
}

См. также

Литература

  • 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

Ссылки



Wikimedia Foundation. 2010.

Игры ⚽ Нужно решить контрольную?

Полезное


Смотреть что такое "Sax" в других словарях:

  • sax — sax …   Dictionnaire des rimes

  • şaxələnmə — «Şaxələnmək»dən f. is …   Azərbaycan dilinin izahlı lüğəti

  • SAX — steht für: Sax (Asteroid), ein Asteroid des Hauptgürtels Sax (Waffe), ein einschneidiges Hiebschwert des frühen Mittelalters Sax (Zigaretten Marke), eine italienische Zigaretten Marke Sax (Alicante), eine Gemeinde in der spanischen Provinz… …   Deutsch Wikipedia

  • SAX — (Simple API for XML) is a serial access parser API for XML. SAX provides a mechanism for reading data from an XML document. It is a popular alternative to the Document Object Model (DOM). XML processing with SAX A parser which implements SAX (ie …   Wikipedia

  • Sax — steht für: (3534) Sax, ein Asteroid des Hauptgürtels Sax (Waffe) (Brockhaus), andere Schreibweise für Sachs (Duden, Kluge Seebold), ein einschneidiges Hiebschwert des frühen Mittelalters Sax (Zigaretten Marke), eine italienische Zigaretten Marke… …   Deutsch Wikipedia

  • sax — sax·a·tile; sax·aul; sax·horn; sax·i·ca·vous; sax·ic·o·line; sax·ic·o·lous; sax·if·ra·ga; sax·i·fra·ga·ce·ae; sax·i·frage; sax·if·ra·gous; sax·i·frax; sax·ig·e·nous; sax·o·nian; sax·on·ic; sax·on·ism; sax·on·ist; sax·on·ize; sax·on·ly; sax·o·ny;… …   English syllables

  • Sax — or sax may refer to:* Saxophone, a musical instrument * Sax, Alicante, a municipality in Spain * SAX (Simple API for XML), a method of reading data files in computing * SaX, a tool for configuring graphics hardware in SUSE Linux * The Saxony… …   Wikipedia

  • SAX — Cette page d’homonymie répertorie les différents sujets et articles partageant un même nom. SAX, sigle composé des trois lettres S, A et X, peut faire référence à : Simple API for XML, Sambu, Panama, selon la liste des codes AITA des… …   Wikipédia en Français

  • SaX — Saltar a navegación, búsqueda SaX2 mostrando la configuración de la tarjeta y el monitor SaX (SUSE Automated X configuration), es el configurador de monitor y tarjeta de video de SUSE Linux de Novell y openSUSE. Junto con YaST, son las… …   Wikipedia Español

  • sax — [ saks ] n. m. • v. 1970; de saxophone ♦ Fam. Saxophone. ⇒ saxo. ⊗ HOM. Saxe. Sax (Antoine Joseph, dit Adolphe) (1814 1894) facteur d instruments et flûtiste belge naturalisé français. Il inventa le saxophone (1845) et le saxhorn. sax [saks] n. m …   Encyclopédie Universelle


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»