Unmarshaling XML с HTML-сущностей, используя JAXB - PullRequest
0 голосов
/ 23 июня 2009

Мне нужно загрузить истории ревизий википедии в POJO, поэтому я использую JAXB для демонтажа дампа данных википейды (ну, отдельных его страниц). Проблема в том, что текстовые узлы иногда содержат сущности, которые не определены в дампе wikipedia xml. например: & deg; (`& deg; ', пожалуйста, имейте в виду, что я не знаю полного набора сущностей, которые мне нужно для чтения. Мой входной файл - 3 ТБ, поэтому давайте просто предположим, что все, что может отобразить html, находится там.).

Как я могу настроить JAXB для обработки объектов, которые не являются допустимыми XML?

Вот SAX-исключение, которое JAXB генерирует при обнаружении неопределенной сущности:

Exception in thread "main" javax.xml.bind.UnmarshalException

 - with linked exception:

[org.xml.sax.SAXParseException: The entity "deg" was referenced, but not declared.]

    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315)

    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:481)

    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:199)

    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:168)

    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137)

    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:184)

    at com.stottlerhenke.tools.wikiparse.WikipediaIO.readPage(WikipediaIO.java:73)

    at com.stottlerhenke.tools.wikiparse.WikipediaIO.main(WikipediaIO.java:53)

Caused by: org.xml.sax.SAXParseException: The entity "deg" was referenced, but not declared.

    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)

    at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)

    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)

    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)

    at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)

    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEntityReference(Unknown Source)

    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)

    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)

    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)

    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)

    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)

    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)

    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:195)

Редактировать: Ввод, который вызвал это исключение, является полной историей изменений для статьи в Википедии о Полярный круг . XSD, используемый для генерации классов JAXB, находится здесь: http://www.mediawiki.org/xml/export-0.3.xsd

Редактировать: Источником этой проблемы была ошибка с моей стороны - я использовал первоначальный экстрактор, который не поддерживал закодированные сущности должным образом. Тем не менее, я нашел способ обойти это, если у кого-то возникнет проблема, о которой я думал . Смотри ниже.

Ответы [ 2 ]

1 голос
/ 23 июня 2009

Разрешение сущностей не является задачей JAXB. Это работа основного Синтаксический анализатор XML.

Что вы могли бы сделать:

  • Считайте данные самостоятельно, используя DOM
  • замените все неразрешенные объекты чем-то, что вы пожелаете
  • тогда позвольте JAXB обработать результат
0 голосов
/ 23 июня 2009

Это взлом, но он работает в крайнем случае.

Я загрузил определения сущности html с w3.org и установил для doctype входного xml-файла значение xhtml-transitional, но перенаправил URL-адрес doctype на локальный dtd:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "xhtml1-transitional.dtd">

xhtml1-transitional.dtd, в свою очередь, требует:

  • XHTML-lat1.ent
  • XHTML-special.ent
  • XHTML-symbol.ent

который я отсосал и положил вдоль стороны xhtml1-transitional.dtd

(все файлы доступны по адресу: http://www.w3.org/TR/xhtml1/DTD/)

Как я уже сказал, ужасно чертовски, но он сделал , кажется, справился с работой.

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