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