Pregunta

Necesito cargar historiales de revisión de wikipedia en POJO, así que estoy usando JAXB para deshacer el volcado de datos de wikipeida (bueno, páginas individuales de él). El problema es que los nodos de texto ocasionalmente contienen entidades que no están definidas en el volcado xml de wikipedia. por ejemplo: ° (`& amp; deg; 'por favor tenga en cuenta que no conozco el conjunto completo de entidades que necesito poder leer. Mi archivo de entrada es de 3tb, así que supongamos que todo lo que html puede representar está en ahí.).

¿Cómo puedo configurar JAXB para manejar entidades que no son válidas xml?

Aquí está la excepción SAX que lanza JAXB cuando encuentra una entidad indefinida:

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)

Editar: La entrada que activó esa excepción es el historial completo de revisiones para el artículo de Wikipedia en Círculo Polar Ártico . El XSD utilizado para generar las clases JAXB está aquí: http://www.mediawiki.org /xml/export-0.3.xsd

Editar: El origen de este problema fue un error de mi parte: estaba usando un extractor inicial que no mantenía correctamente las entidades codificadas. Sin embargo, encontré una forma de evitar esto, si alguien tuviera el problema que pensé que tenía. Ver abajo.

¿Fue útil?

Solución 2

Este es un truco, pero funciona en caso de necesidad.

Descargué las definiciones de entidad html de w3.org y configuré el doctype del archivo xml de entrada en xhtml-transitional, pero dirigí la urct de doctype a un dtd local:

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

xhtml1-transitional.dtd, a su vez, requiere:

  • xhtml-lat1.ent
  • xhtml-special.ent
  • xhtml-symbol.ent

que chupé y puse junto a xhtml1-transitional.dtd

(Todos los archivos están disponibles en: http://www.w3.org/TR / xhtml1 / DTD / )

Como dije, feo como el infierno, pero parecía hacer el trabajo.

Otros consejos

Resolver entidades no es el trabajo de JAXB. Es el trabajo del subyacente Analizador XML.

Lo que puedes hacer es:

  • lea los datos usted mismo usando DOM
  • reemplazar todas las entidades no resueltas por algo que desee
  • entonces, deje que JAXB maneje el resultado
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top