使用JAXB使用html实体解组xml

时间:2009-06-22 21:20:26

标签: java xml jaxb

我需要将维基百科修订历史记录加载到POJO中,因此我使用JAXB来解组wikipeida数据转储(以及它的各个页面)。问题是文本节点偶尔包含未在维基百科xml转储中定义的实体。例如:°(`& deg;'请记住,我不知道我需要能够读取的完整实体集。我的输入文件是3tb,所以让我们假设html可以呈现的所有内容都在那里。)。

如何配置JAXB来处理无效的实体xml?

这是JAXB遇到未定义实体时抛出的SAX异常:

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)

编辑:触发该异常的输入是Arctic Circle上维基百科文章的完整修订历史记录。用于生成JAXB类的XSD位于:http://www.mediawiki.org/xml/export-0.3.xsd

编辑:这个问题的根源是我的错误 - 我使用的是一个初始提取器,它没有正确维护编码实体。但是,我确实找到了解决这个问题的办法,如果有人遇到我想到的问题。见下文。

2 个答案:

答案 0 :(得分:1)

解析实体不是JAXB的工作。这是潜在的工作 XML解析器。

你能做的是:

  • 使用DOM
  • 自行阅读数据
  • 用您希望的内容替换所有未解析的实体
  • 然后,让JAXB处理结果

答案 1 :(得分:0)

这是一个黑客攻击,但它可以在紧急情况下工作。

我从w3.org下载了html实体定义,并将输入xml文件的doctype设置为xhtml-transitional,但是将doctype url定向到本地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/

就像我说的那样丑陋,但 似乎做了这件事。