2010-01-03 2 views
2

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

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, но как отключить сущность, проверяющую alltogther?

EDIT: Это приложение для Android, поэтому я неохотно использую API/библиотеку, которая не входит в стандартную среду.

ответ

1

SAX, похоже, не способен на это, но API StAX. См. this previous question/answer, как это сделать.

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

+0

На самом деле, я узнал, что платформа Android включает очень похожий (тот же?) API, который они называют XmlPullParser. –

+0

Да, XPP тоже хорош, хотя он нестандартен (в условиях JavaSE, во всяком случае). – skaffman

0

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

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

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

0

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

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

+0

Это приложение для Android и, следовательно, скорее не будет включать зависимость JTidy или использовать DOM. –

1

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

Edit: Просто увидел, что это андроид приложение. Это сделает его более жестким. NekoHTML входит в 109kb и TagSoup на 89kb.

 Смежные вопросы

  • Нет связанных вопросов^_^