java - 使用 JAXB 将 xml 与 html 实体解码

标签 java xml jaxb

我需要将 wikipedia 修订历史加载到 POJO 中,因此我使用 JAXB 来解码 wikipeida 数据转储(好吧,它的各个页面)。问题是文本节点偶尔包含维基百科 xml 转储中未定义的实体。例如:°(“°”请记住,我不知道我需要能够读取的完整实体集。我的输入文件是 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

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

最佳答案

解析实体不是 JAXB 的工作。这是底层的工作 XML 解析器。

你可以做的是:

  • 使用 DOM 自行读取数据
  • 将所有未解析的实体替换为您想要的实体
  • 然后,让 JAXB 处理结果

关于java - 使用 JAXB 将 xml 与 html 实体解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1029462/

相关文章:

java - Feign Client 不解析 Query 参数

xml - 从 JSON 字符串中读取数组元素的 XPath

java - Android WifiManager getScanResult 提示需要 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION 权限,尽管已声明权限

java - JAXB 从 XSD 生成的类中存在错误

python - 使用 BeautifulSoup 解析具有多个根的 xml

java - XmlJavaTypeAdapter 可以将对象编码到另一个对象吗?

java - 使用 JSON 和 XML 中的泛型的 Jersey Jackson 自定义响应

java - 为什么总是 threadPoolExecutor.getActiveCount() <= MaximumPoolSize/2?

sql - 如何获取 varchar(MAX) 字符串类型的 XML 标记的值?