27.08.2015

Парсер SAX

SAX - альтернатива стандартному парсеру DOM, который в силу особенностей реализации (создание в памяти объекта XMLDocument, содержащего целиком весь файл), подходит только для распарсивания маленьких xml-документов.

Фишка парсера в том, что поток InputStream обрабатывается последовательно и к тем или иным событиям применяется пользовательская логика:
             SAXParserFactory factory = SAXParserFactory.newInstance();
             SAXParser parser;
             parser = factory.newSAXParser();
             MySAXParser prsHandler = new MySAXParser();
             parser.parse(is, prsHandler);
, где is - объект класса InputStream, MySAXParser - класс с перекрытыми методами обработки событий
public class MySAXParser extends DefaultHandler{
    private String currentParameterTypes;
    private String currentQName;
 
    @Override
    public void startDocument(){  //событие начала парсинга
        System.out.println("start parse document;");
    }
   
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes){
        // встретили элемент
        this.currentParameterTypes = qName;
    }
   
    @Override
    public void endElement(String uri, String localName, String qName){
        // вышли из элемента
    }
   
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        // получает значение тега/атрибута this.currentParameterTypes
        String value = new String(ch, start, length);
    }
}
Ниже - график заполнения heap'a во время распарсивания файда в 150МБ.




Комментариев нет :