【问题标题】:failed to parse xml which contain html character entities in java无法解析包含 java 中的 html 字符实体的 xml
【发布时间】:2018-05-10 09:49:05
【问题描述】:

当xml由html字符实体组成时,它会抛出这样的异常

[com.ctc.wstx.exc.WstxLazyException] com.ctc.wstx.exc.WstxParsingException: Undeclared general entity "ensp"
at [row,col {unknown-source}]: [1,66475]

有什么方法可以声明通用实体,这样我就不必处理这个异常了。

【问题讨论】:

    标签: java xml


    【解决方案1】:

    如果您可以编辑正在解析的 XML,并且 XML 在文档开头有 DOCTYPE 声明,则需要为 ensp 添加实体声明:

    <!ENTITY ensp "&#8194;">
    

    如果你可以编辑 XML,但它没有 DOCTYPE 声明,你可以组成一个通用的,如下所示:

    <!DOCTYPE root [
      <!ELEMENT root ANY>
      <!ENTITY ensp "&#8184;">
    ]>
    ... content ...
    

    其中root 替换为您拥有的 XML 数据的文档元素(根元素)。

    如果您想将所有 HTML 实体扩展为数字字符实体(不仅仅是ensp),请查看https://www.w3.org/TR/html5/single-page.html#named-character-referenceshttp://sgmljs.net/docs/html5.html#named-character-references

    如果您无权访问或无法更改或不想更改 XML(例如当您从网络中提取 XML 时),那么您可能会幸运地使用 Java 的 JAXP API开发一个自定义 EntityResolver 并使用您的自定义实体解析器(参见 https://docs.oracle.com/javase/8/docs/api/org/xml/sax/EntityResolver.html)让您的 XML 解析管道。

    【讨论】:

    • @BibekShakya StAX/woodstox 的一般技术在例如。 @ 987654324@ 虽然我发现对于似乎与您的问题完全相同的发布者来说它并没有解决:对未声明实体的引用在 XML 中无效并被拒绝。如果你想解析 HTML,我建议使用 HTML 或 SGML 解析器而不是 XML 解析器,尽管 Java 的选项有限。
    【解决方案2】:

    实体“ensp”是一个空格字符实体,您可以解析该属性的 XML/HTML,然后用不同的东西替换。

            File file = new File(yourFile);
            BufferedReader bufferedReader = new BufferedReader(file);
    
            StringBuilder stringBuilder = new StringBuilder();
            String inputLine;
    
            while ((inputLine = bufferedReader.readLine()) != null) {
                stringBuilder.append(inputLine);
            }
    
            String content = stringBuilder.toString();
            content = content.replace("ensp;", " ");
    

    举个例子。

    编辑:抱歉弄错了你的问题。这可能不是您正在寻找的答案。

    【讨论】:

      【解决方案3】:

      听起来您缺少 Woodstox XML 解析器的一些配置:

      https://medium.com/@cowtowncoder/configuring-woodstox-xml-parser-woodstox-specific-properties-1ce5030a5173

      P_TREAT_CHAR_REFS_AS_ENTS(默认值:false):通常字符引用(如 &)被简单地扩展并报告为字符数据的一部分;但如果此属性设置为 true,则它们将被报告为 ENTITY 令牌。当尝试完全再现 XML 文档的输入表示时,这有时可能很有用,包括选择特殊字符的转义。 注意:这仅适用于文本内容 — 不支持属性值(因为没有单独的标记;属性只能通过 START_ELEMENT 标记访问)

      API 文档: http://fasterxml.github.io/woodstox/javadoc/5.0/com/ctc/wstx/api/WstxInputProperties.html#P_TREAT_CHAR_REFS_AS_ENTS

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-12
        • 1970-01-01
        • 2019-01-15
        • 1970-01-01
        • 1970-01-01
        • 2014-09-12
        • 2019-09-26
        • 2020-03-10
        相关资源
        最近更新 更多