5

我有需要解析包含字符实体的 XML 的程序。程序本身不需要解决它们,它们的列表很大并且会改变,所以如果可以的话,我想避免对这些实体的显式支持。

这是一个简单的例子:

<?xml version="1.0" encoding="UTF-8"?>
<xml>Hello there &something;</xml>

是否有可以在不解析(非标准)字符实体的情况下成功解析文档的 Java XML API?理想情况下,它将它们转换为可以特殊处理的特殊事件或对象,但我会选择一个可以默默压制它们的选项。

答案和例子:

Skaffman 给了我答案:使用IS_REPLACING_ENTITY_REFERENCES设置为 false 的 StAX 解析器。

这是我准备尝试的代码:

XMLInputFactory inputFactory = XMLInputFactory.newInstance();
inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
XMLEventReader reader = inputFactory.createXMLEventReader(
    new FileInputStream("your file here"));

while (reader.hasNext()) {
    XMLEvent event = reader.nextEvent();
    if (event.isEntityReference()) {
        EntityReference ref = (EntityReference) event;
        System.out.println("Entity Reference: " + ref.getName());
    }
}

对于上面的 XML,它将打印“ Entity Reference: something”。

4

4 回答 4

8

STaX API 通过IS_REPLACING_ENTITY_REFERENCES属性支持不替换字符实体引用的概念:

要求解析器用它们的替换文本替换内部实体引用并将它们报告为字符

这可以设置为XmlInputFactory,然后依次用于构造XmlEventReaderor XmlStreamReader。但是,API 小心地说,这个属性只是为了强制实现执行替换,而不是强制它替换它们。不过,它必须值得一试。

于 2009-11-22T09:49:21.590 回答
1

仅在禁用对外部实体的支持时对我有用:

XMLInputFactory inputFactory = XMLInputFactory.newInstance();
inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
inputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
于 2013-02-07T10:27:00.397 回答
0

带有org.xml.sax.EntityResolver的 SAX 解析可能适合您的目的。你可以肯定地压制它们,你可能会找到一种方法让它们无法解决。

教程似乎最相关:它展示了如何将实体解析为字符串。

于 2009-11-22T07:17:46.923 回答
0

我不是 Java 开发人员,但我“认为”Java xml 类支持与 .net 类似的功能来实现这一点。在 .net xmlreadersettings 类中,您将 ProhibitDtd 属性设置为 false 并将 XmlResolver 属性设置为 null。这将导致解析器忽略外部引用的实体,而不会在读取它们时引发异常。我刚刚在谷歌上搜索了“Java ignore enity”并得到了很多点击,其中一些似乎解决了这个话题。我意识到这不是对您问题的完整答案,但它应该为您指明一个有用的方向。

于 2009-11-22T18:51:17.857 回答