Класс DefaultHandler в Java SAX

Класс 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 имеет больше методов, которые вы можете переопределить.

Оцените статью