Как настроить SaxParserFactory Java для отключения проверки сущностей?

Я пишу приложение для очистки экрана, которое считывает различные страницы и извлекает данные. Я использую SAXParserFactory иди за SAXParser, что, в свою очередь, дает мне XMLReader. Я настроил Фабрику следующим образом:

spf = SAXParserFactory.newInstance();
spf.setValidating(false);
spf.setFeature("http://xml.org/sax/features/validation", false);
spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
spf.setFeature("http://xml.org/sax/features/use-entity-resolver2", false);

Однако всякий раз, когда я анализирую документ, содержащий объект &nbsp, я получаю

SEVERE: null
    org.xml.sax.SAXParseException: The
    entity "nbsp" was referenced, butnot declared.
            at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1231)
            at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)

Я могу понять, что он не может найти объект, так как я сказал фабрике не читать DTD, но как мне полностью отключить проверку объектов?

РЕДАКТИРОВАТЬ: это для приложения для Android, поэтому я не хочу использовать API/библиотеку, которая не входит в стандартную среду.


person Leonard Ehrenfried    schedule 03.01.2010    source источник


Ответы (4)


SAX, кажется, не способен на это, но StAX API может. См. этот предыдущий вопрос/ответ о том, как это настроить.

Если вы пишете XML-процессор вручную, с StAX API работать намного проще, чем с SAX API, так что вы выигрываете по обоим пунктам.

person skaffman    schedule 03.01.2010
comment
На самом деле я обнаружил, что платформа Android включает в себя очень похожий (тот же самый?) API, который они называют XmlPullParser. - person Leonard Ehrenfried; 06.01.2010
comment
Да, XPP тоже хорош, хотя и нестандартен (во всяком случае, в терминах JavaSE). - person skaffman; 06.01.2010

Если вы читаете HTML-страницы, я настоятельно рекомендую использовать одну из библиотек, которая имеет дело с тем фактом, что даже действительный HTML не является XML, и большая часть HTML недействительна. Попробуйте один из них:

Изменить: только что увидел, что это приложение для Android. Это сделает его жестче. NekoHTML имеет размер 109 КБ, а TagSoup — 89 КБ.

person Jamie McCrindle    schedule 03.01.2010

Мне кажется, что вы отключили возможность парсера понять, что делать с  . Что вы ожидаете от синтаксического анализатора SAX, учитывая, что он вообще не понимает эту сущность.

Возможно, если вы парсите HTML, вам лучше использовать JTidy? Это парсер HTML, который представляет HTML в DOM для дальнейшего анализа.

person Brian Agnew    schedule 03.01.2010
comment
Это приложение для Android и, следовательно, лучше не включать зависимость, такую ​​​​как JTidy, или использовать DOM. - person Leonard Ehrenfried; 03.01.2010

Я думаю, что можно перехватить эти ошибки, написав свой собственный экземпляр DOMErrorHandler — подробнее здесь: http://xerces.apache.org/xerces2-j/faq-write.html

Я использовал этот подход для решения проблемы, из-за которой я анализировал рисунок как XML-документ SVG, сгенерированный Corel Draw 12, который иногда нарушает правила SVG DTD в выходных документах.

Почему вы сказали ему не читать DTD? Это потому, что вы не хотите, чтобы он получал доступ к этому с серверов W3C, подключаясь к Интернету; Вы хотите автономное, внесетевое решение с локальным DTD? Мне нужно было то же самое: я скачал SVG DTD и модули локально и использовал эту библиотеку Java для принудительного локального доступа к DTD: http://doctypechanger.sourceforge.net/

person therobyouknow    schedule 03.01.2010