Как избежать SAXParseException, используя Xerces, когда HTML-файл включает mdash? - PullRequest
2 голосов
/ 27 ноября 2009

Я использую реализацию Xerces в JDK6 для выполнения запросов XPath к переходному документу HTML 4.0. Со следующим кодом:

XPath newXPath = XPathFactory.newInstance().newXPath();
XPathExpression xpathExpr = newXPath.compile(expression);
Object xPathResult = xpathExpr.evaluate(inputSource, XPathConstants.NODESET);

Где inputSource построен из FileInputStream, я получаю исключение:

Caused by: org.xml.sax.SAXParseException: The entity "mdash" was referenced, but not declared.  
 at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:239) 
 at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283)
 at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:291)  

Это сообщение также выводится на стандартный вывод:

[Fatal Error] :20:43: The entity "mdash" was referenced, but not declared.

Как мне избежать этого исключения?

Файл HTML создается из преобразования XSLT из XML. Я не думаю, что это обязательно должно быть —, я не уверен. HTML-код должен отображаться в приложении Java Swing.

Мне трудно судить, какая информация из моей конкретной реализации имеет отношение к этой проблеме. Пожалуйста, дайте мне знать по комментариям, если требуется дополнительная информация.


Итак, у меня сложилось неправильное представление о том, что HTML - это XML (результат того, что я вообще об этом не думал).

Итак, учитывая файл HTML, как мне решить эту проблему?

  • Предоставление парсеру DTD для HTML 4?
  • Заменить — на эквивалентный. HTML создается из преобразования XSLT. Можно ли установить таблицу стилей для замены mdash эквивалентным числовым символом?
  • Существуют ли какие-либо библиотеки, которые исправили бы HTML-код перед его передачей парсеру? Я заметил, что JTidy упоминается для подобных целей.

Ответы [ 5 ]

3 голосов
/ 27 ноября 2009

Проблема в том, что если документ, представленный в Xerces, не имеет DTD с объявленным mdash, он не является правильно сформированным XML-документом - все объекты должны быть объявлены. HTML имеет набор «встроенных» сущностей, о которых должны знать процессоры HTML, и они должны быть в DTD.

Самый простой обходной путь без DTD - заменить mdash его числовым эквивалентом (— или —)

3 голосов
/ 27 ноября 2009

Правильный DTD в заголовке вашего файла должен содержать все необходимые объявления сущностей, и если ваш файл правильно сформирован, то парсер будет учитывать эту информацию.

Если есть вероятность, что HTML не очень хорошо сформирован, я бы порекомендовал библиотеку TagSoup для исправления этого. Он считывает ввод и пытается выдать действительный XHTML в качестве вывода, никогда не сообщая об ошибках синтаксического анализа, просто пытаясь исправить их с помощью встроенной эвристики. Мне удалось успешно обработать очень испорченный HTML из Интернета и выполнить запросы XPath по нему (кажется, это то, что вам нужно).

2 голосов
/ 27 ноября 2009

Я думаю, что нашел проблему для моей конкретной ситуации. Файл HTML был сгенерирован из файла XML с использованием XSLT. Изменяя строку:

<xsl:output method="html" />  

до:

<xsl:output method="xml" />

Преобразование не создало сущность &mdash;. Выходной файл может быть проанализирован с помощью Xerces.

Я не уверен, что это "правильно", но, похоже, это помогает при отображении в Swing.

1 голос
/ 27 ноября 2009

Столкнувшись с такой проблемой, я запускаю (X) HTML через JTidy . JTidy примет входные данные, смутно напоминающие HTML или XML, и, при наличии соответствующих параметров, превратит их в правильно сформированный XML, который поддается обработке всеми обычными инструментами XML.

Это избавляет меня от необходимости разбираться со всеми специальными и угловыми случаями, которые могут возникнуть. Это единовременная попытка выяснить, как соединить вход и выход и какие опции использовать; после этого он просто работает и торгует.

Это не решение вашей конкретной проблемы с mdash & ndash; но я подозреваю, что это все равно будет далеко от последней твоей проблемы.

1 голос
/ 27 ноября 2009

Учитывая, что HTML не является XML, я думаю, вы можете столкнуться с множеством проблем при попытке анализа HTML Transitional с помощью XML-анализатора. Но если ваш HTML на самом деле является правильно сформированным XML, mdash и другие сущности обычно определяются в DTD. Убедитесь, что ваш анализатор имеет DTD для документа, и он должен быть в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...