Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 475

Ильдар Шаукатович Хабибуллин

}

}

public static void main(String[] args){

if (args.length < 1){

System.err.println("Usage: java NotebookHandler ntb.xml");

System.exit(1);

}

try{

NotebookHandler handler = new NotebookHandler();

SAXParserFactory fact = SAXParserFactory.newInstance();

fact.setNamespaceAware(true); fact.setValidating(true);

SAXParser saxParser = fact.newSAXParser();

saxParser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);

File f = new File(args[0]);

saxParser.parse(f, handler);

for (int k = 0; k < pers.size(); k++)

System.out.println((pers.get(k)).getSurname());

}catch(SAXNotRecognizedException x){

System.err.println("HeH3BecTHoe свойство: " +

JAXP_SCHEMA_LANGUAGE) ;

System.exit(1);

}catch(Exception ex){

System.err.println(ex);

}

}

public void warning(SAXParseException ex){ System.err.println("Warning: " + ex); System.err.println("line = " + ex.getLineNumber() +

" col = " + ex.getColumnNumber());

}

public void error(SAXParseException ex){ System.err.println("Error: " + ex);

System.err.println("line " col

+ ex.getLineNumber() +

+ ex.getColumnNumber());

}

public void fatalError(SAXParseException ex){ System.err.println("Fatal error: " + ex); System.err.println("line = " + ex.getLineNumber() +

" col = " + ex.getColumnNumber());

}

}

После того как класс-обработчик написан, проанализировать документ очень легко. Стандартные действия приведены в методе main () программы листинга 28.9.

Поскольку реализация парсера сильно зависит от его программного окружения, SAX-парсер — объект класса SAXParser — создается не конструктором, а фабричным методом newSAXParser().

Объект-фабрика, в свою очередь, формируется методом newinstance (). Далее можно методом

void setFeature(String name, boolean value);

установить свойства парсеров, создаваемых этой фабрикой. Например, после

fact.setFeature("", true);

парсеры, создаваемые фабрикой fact, будут учитывать префиксы имен тегов и атрибутов.

Список таких свойств можно посмотреть в документации Java API в описании пакета org.xml.sax или на сайте проекта SAX . Следует учитывать, что не все парсеры полностью выполняют эти свойства.

Если к объекту-фабрике применить метод

void setValidating(true);

как это сделано в листинге 28.9, то она будет производить парсеры, проверяющие структуру документа. Если применить метод

void setNamespaceAware(true);

то объект-фабрика будет производить парсеры, учитывающие пространства имен.

После того как объект-парсер создан, остается только применить метод parse (), передав ему имя анализируемого файла и экземпляр класса-обработчика событий.

В классе javax.xml.parsers.SAXParser есть десяток методов parse(). Кроме метода parse (File, DefaultHandler), использованного в листинге 28.9, существуют еще методы, позволяющие извлечь документ из входного потока класса InputStream, объекта класса InputSource, адреса URI или из специально созданного источника класса InputSource.

Методом setProperty() можно задать различные свойства парсера. В листинге 28.9 этот метод использован для того, чтобы парсер проверял правильность документа с помощью схемы XSD. Если парсер выполняет проверки, т. е. применен метод setValidating(true), то имеет смысл сделать развернутые сообщения об ошибках. Это предусмотрено интерфейсом ErrorHandler. Он различает предупреждения, ошибки и фатальные ошибки и описывает три метода, которые автоматически выполняются при появлении ошибки соответствующего вида: