SAX - альтернатива стандартному парсеру DOM, который в силу особенностей реализации (создание в памяти объекта XMLDocument, содержащего целиком весь файл), подходит только для распарсивания маленьких xml-документов.
Фишка парсера в том, что поток InputStream обрабатывается последовательно и к тем или иным событиям применяется пользовательская логика:
Фишка парсера в том, что поток 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МБ.
Комментариев нет :
Отправить комментарий