Отличие SAXParserFactory от XMLReaderFactory. Какой выбрать?

Оба они, похоже, имеют одну и ту же цель (создать XMLReader). Некоторые учебники содержат одно, некоторые другое.

SAXParserFactory:

пример кода:

// SAXParserFactory
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader();
reader.parse(new InputSource("document.xml"));

XMLReaderFactory:

пример кода:

// XMLReaderFactory
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
xmlReader.parse(new InputSource("document.xml"));

вопрос:

Это основные различия или есть некоторые, которые я наблюдал?

Какой из них выбрать?


person juwens    schedule 14.05.2012    source источник
comment
SAXParserFactory — это JAXP, а XMLReaderFactory — это официальный SAX API. Я помню старую книгу SAX2 от O'Reilly, в которой рекомендовался официальный API из-за того, как он обрабатывает пространства имен. Не знаю, актуально ли это уже. Но, я думаю, я бы использовал XMLReaderFactory, если бы мне по какой-то причине не понадобился JAXP. Может быть, кто-то еще может предоставить более актуальный вклад.   -  person Nathan Ryan    schedule 14.05.2012


Ответы (2)


Основные JAXP APIs определены в пакете javax.xml.parsers. Этот пакет содержит независимые от поставщика фабричные классы, такие как SAXParserFactory, которые дают вам SAXParser.

SAXParserFactory определяет фабричный API, который позволяет приложениям настраивать и получать синтаксический анализатор на основе SAX для анализа XML-документов.

  • SAXParser определяет API, обертывающий класс реализации XMLReader.

  • Пакет org.xml.sax определяет основные API-интерфейсы SAX.

  • Java Runtime поставляется с реализацией по умолчанию XMLReader

SAXParserFactory скрывает информацию о том, какая (SAX1) ParserFactory / (SAX2) XMLReaderFactory, ... от вас.

Если вы хотите иметь возможность заменить синтаксический анализатор JAXP по умолчанию другим синтаксическим анализатором JAXP (в реализации по умолчанию может быть известная несовместимость/ошибка), вам следует использовать независимый от поставщика SAXParserFactory.

Если вы знаете, что ваше приложение всегда будет использовать SAX2 XMLReader, вы можете использовать XMLReaderFactory.

person andih    schedule 14.05.2012

Эллиотт Расти Гарольд, написавший книгу об обработке XML в Java, однажды написал:

SAXParserFactory [is] a hideous, evil monstrosity of a class that should 
be hung, shot, beheaded, drawn and quartered, burned at the stake, 
buried in unconsecrated ground, dug up, cremated, and the ashes tossed 
in the Tiber while the complete cast of Wicked sings "Ding dong, the 
witch is dead."  --Elliotte Rusty Harold on xml-dev 

На самом деле я бы не стал заходить так далеко (а если бы и зашел, то попытался бы сделать это грамматически правильным). Как и многие JAXP, это не самая замечательная часть дизайна; но я использую его как способ получения экземпляра парсера по умолчанию, хотя бы потому, что он совместим с другими частями JAXP.

Исторически сложилось так, что они развивались параллельно. Первоначально JAXP пытался добавить недостающую функциональность в SAX1, но параллельно появился SAX2 и заполнил некоторые пробелы, так что этот конкретный пробел был заполнен дважды.

person Michael Kay    schedule 14.05.2012