Класс org.xml.sax.helpers.DefaultHandler является базовым классом для «слушателей» в SAX 2.0.
Вы создаете подкласс DefaultHandler и переопределяете некоторые унаследованные методы в этом подклассе. В этом тексте покажем очень простой пример подкласса DefaultHandler, который просто распечатывает подробности о файле XML. Вот код:
public class SaxHandler extends DefaultHandler {
public void startDocument() throws SAXException {
System.out.println("start document : ");
}
public void endDocument() throws SAXException {
System.out.println("end document : ");
}
public void startElement(String uri, String localName,
String qName, Attributes attributes)
throws SAXException {
System.out.println("start element : " + qName);
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("end element : " + qName);
}
public void characters(char ch[], int start, int length)
throws SAXException {
System.out.println("start characters : " +
new String(ch, start, length));
}
}
Когда вы запускаете этот код, с этим файлом в качестве ввода:
text 1
text 2
… вы получите следующий вывод в System.out:
start document :
start element : root
characters :
start element : child
characters :
start element : grandchild
characters : text 1
end element : grandchild
characters :
end element : child
characters :
start element : child
characters :
start element : grandchild
characters : text 2
end element : grandchild
characters :
end element : child
characters :
end element : root
end document :
Это последовательность, в которой SAXParser вызывает соответствующие методы в экземпляре SaxHandler при обработке файла XML, показанного выше.
Возможно, вы заметили, что иногда метод characters() выводит разрыв строки. Это связано с тем, что метод characters() вызывается SAXParser с пробельными символами, расположенными между концом начального тега родительского элемента и дочерним тегом begin. Другими словами, символы пробела, отмеченные здесь с помощью точек(…):
...
....
Иногда также имеются пробельные символы, расположенные после конца конечного тега элемента и до начала следующего родственного тега или до начала конечного тега родительского элемента.
Инструкции по обработке
Класс DefaultHandler также имеет метод, когда инструкции по обработке XML находятся в файле XML:
public void processingInstruction(String target, String data)
throws SAXException {
}
Исключения
Класс DefaultHandler имеет три метода, которые вы можете переопределить для обработки исключений, возникающих при разборе XML. Вот они:
public void warning(SAXParseException e) throws SAXException {
}
public void error(SAXParseException e) throws SAXException {
}
public void fatalError(SAXParseException e) throws SAXException {
}
Допустим, синтаксический анализатор обнаружил недопустимую сущность XML (например, notLegal;). Затем SAXParser вызовет метод fatalError(), прежде чем прервать синтаксический анализ.
Если возникает менее опасная ошибка, SAXParser может просто вызвать метод error() или warning(). Таким образом, вы можете собирать все ошибки в списке и возвращать их все сразу, а не по одному, когда они встречаются. DefaultHandler имеет больше методов, которые вы можете переопределить.
