【问题标题】:Ignoring strange Parsing errors with Xerces使用 Xerces 忽略奇怪的解析错误
【发布时间】:2012-07-17 12:46:39
【问题描述】:

我正在尝试将以下 url 解析为 Java 中的 DOM 文档:http://www.op.org/en/rss-category-home/8

但是,当我这样做时,我收到以下错误:

13:51:38,470 ERROR ~ Error processing site Site 1
org.xml.sax.SAXParseException: The entity "acirc" was referenced, but not declared.
    at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:124)
    at logic.server.RssReader.readRss(RssReader.java:44)
    at logic.server.GatherData.doJobWithResult(GatherData.java:49)
    at logic.server.GatherData.doJobWithResult(GatherData.java:1)

我在某处读到,当前 JRE 中的 Xerces 解析器存在与此相关的错误,因此下载了 Xerces2 2.11.0,但仍然存在同样的问题。

我怎样才能解决这个问题。我无法控制 RSS 提要本身,但需要解析 XML 来处理文章。

我的代码是: DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

    DocumentBuilder builder = dbf.newDocumentBuilder();
    Document dom = builder.parse(rssUrl.openStream());
    NodeList nodes = dom.getElementsByTagName("item");
    etc. etc.

非常感谢任何解决此问题的帮助!

编辑: 如果我会尝试下面的解决方案并添加 DTD,我会在哪里做呢?当前的 RSS 元素是:

<rss version="2.0" xml:base="http://www.op.org/en/rss-category-home/8" xmlns:dc="http://purl.org/dc/elements/1.1/" content="http://purl.org/rss/1.0/modules/content/" dc="http://purl.org/dc/terms/" foaf="http://xmlns.com/foaf/0.1/" og="http://ogp.me/ns#" rdfs="http://www.w3.org/2000/01/rdf-schema#" sioc="http://rdfs.org/sioc/ns#" sioct="http://rdfs.org/sioc/types#" skos="http://www.w3.org/2004/02/skos/core#" xsd="http://www.w3.org/2001/XMLSchema#">

或者我会将它添加到每个包含 XHTML 代码的“描述”元素中吗?我尝试了这个后来的解决方案,但它仍然给出了同样的错误。

<description xmlns="http://www.w3.org/1999/xhtml">

【问题讨论】:

    标签: java xml xml-parsing xerces


    【解决方案1】:

    如果 XML 中有错误,为什么要忽略它? XML 解析器旨在拒绝错误的 XML。

    此 XML 似乎包含一个实体引用 &amp;acirc;,但不包含定义此实体的 DTD。这是标准 XHTML 实体之一,因此您可以通过添加对 XHTML 中相关实体声明 DTD 模块的引用来修复 XML。

    【讨论】:

    • 当然,我可以看看,但由于我无法控制 XML,我需要在解析之前先手动编辑字符串。我希望我能避免这种情况。这里的问题是引用位于 RSS 提要中的文章正文中。大多数 RSS 生成器只是在标签之间转储内容,而不知道其中的内容。
    • 是的,RSS 生成器在遵守 XML 标准方面出了名的松懈。您需要在内容之前(但在任何 XML 声明之后)添加一个 doctype 声明 '..>`。这可以引用外部 DTD,也可以包含内联的实体定义。添加 DOCTYPE/DTD 与添加命名空间不同,这是您的示例所做的!
    • 感谢您的帮助。我最终在字符串中搜索 标记并将其间的所有内容添加为数据。这也解决了将来以糟糕的 xhtml 作为内容的任何其他问题。
    • 我将它添加到 DTD 数组中,它解决了我的问题--
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多