Вопрос

Я пытаюсь написать синтаксический анализатор SAX для документа XHTML, который я загружаю из Интернета.Сначала у меня возникла проблема с объявлением doctype (я узнал из здесь что это было из-за того, что W3C намеренно заблокировал доступ к DTD), но я исправил это с помощью:

XMLReader reader = parser.getXMLReader();
reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);

Однако сейчас я сталкиваюсь со второй проблемой.Анализатор SAX выдает исключение, когда достигает некоторого Javascript, встроенного в документ XHTML:

    <script type="text/javascript" language="JavaScript">
function checkForm() {
answer = true;
if (siw && siw.selectingSomething)
    answer = false;
    return answer;
}//
</script>

В частности, анализатор выдает ошибку, как только он достигает &&'s , поскольку он ожидает ссылку на объект.Точным исключением является:

`org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:391)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1390)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEntityReference(XMLDocumentFragmentScannerImpl.java:1814)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3000)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:624)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:486)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:810)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:740)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:110)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1208)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:525)
at MLIAParser.readPage(MLIAParser.java:55)
at MLIAParser.main(MLIAParser.java:75)`

Я подозреваю (но я не знаю), что если бы я не отключил DTD, то не получил бы эту ошибку.Итак, как я могу избежать ошибки DTD и избежать ошибки ссылки на объект?

Ваше здоровье,

Пит

Это было полезно?

Решение

(X) HTML, который вы пытаетесь проанализировать, не является допустимым XML (иначе вы бы не получали ошибку синтаксического анализа SAX).И, двойной амперсанд ("&&") подтверждает это.Это означает, что само по себе вы не можете использовать обычный анализатор XML для разбора документа.

Есть инструменты, которые вы можете использовать, такие как Набор тегов, который будет генерировать правильные события SAX (вы можете использовать тот же код синтаксического анализа SAX / XML, что и раньше), но TagSoup позаботится о сопоставлении плохо сформированных событий HTML с правильными событиями SAX / XML.

Другие советы

Я думаю, вы должны поместить содержимое скрипта, например, в раздел CDATA http://www.w3schools.com/TAGS/tag_script.asp приводит следующий пример:

<script type="text/javascript"><![CDATA[
document.write("Hello World!")
//]]></script>

НекоХТМЛ вероятно, это исправит и для вас, вы используете его как XmlReader.

Если вы используете фильтр SAX, вы также можете вставить События CDATA после того, как вы столкнетесь с начальным элементом для <script>, although that might be parser-dependent as not all parsers support the Особенности LexicalHandler.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top