【问题标题】:Custom entity resolver for XMLStreamReader not workingXMLStreamReader 的自定义实体解析器不起作用
【发布时间】:2017-12-11 18:38:02
【问题描述】:

我有一个要使用 XMLStreamReader 解析的 xml,但它有一些 html 实体(不是 xml 标准的一部分),例如使 next() 方法抛出 XMLStreamException: The entity "uacute" was referenced, but not declared. 的重音字符

我尝试添加实现XMLResolver (https://docs.oracle.com/javase/8/docs/api/javax/xml/stream/XMLResolver.html) 的自定义实体解析器,该文档指出:

如果应用程序希望执行自定义实体解析,它必须使用 setXMLResolver 方法向 XMLInputFactory 注册此接口的实例。

好的,所以我制作了这个类来重现错误:

private void testXMLResolver() throws XMLStreamException {
    String xml = "<example>You know &oacute; is an accented character</example>";
    XMLInputFactory inputFactory = XMLInputFactory.newInstance(); // instantiate XMLInputFactory
    inputFactory.setXMLResolver(new MyEntityResolver()); // Append custom entity resolver
    XMLStreamReader xmlStreamReader = inputFactory.createXMLStreamReader(new ByteArrayInputStream(xml.getBytes())); // create XMLStreamReader for the xml
    xmlStreamReader.next(); // reads <example>
    xmlStreamReader.next(); // reads the text inside <example> tag
    System.out.println("Text is: " + xmlStreamReader.getText());
    xmlStreamReader.next();
}

class MyEntityResolver implements XMLResolver {
    @Override
    public Object resolveEntity(String publicID, String systemID, String baseURI, String namespace) throws XMLStreamException {
        return new ByteArrayInputStream("huehey!!".getBytes());
    }
}

}

先执行testXMLResolver()输出:

文字是:你知道

然后,当最后一个 next() 被执行时,它会抛出异常

线程“main”中的异常 javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,27] 消息:实体“oacute”被引用,但未声明。 在 com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:601) 在 Test.testXMLResolver(Test.java:21) 在 Test.main(Test.java:10) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:483) 在 com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

第一:我不知道为什么 MyXMLResolver 没有解析实体

第二个:为什么在最后一个next()而不是前一个中引发了异常?因为文本是在上一个中解析的。

PS:我将resolveEntity(...) 设为返回InputStream,因为该方法的文档说:

检索资源。该资源可以是以下三种返回类型:(1) java.io.InputStream (2) javax.xml.stream.XMLStreamReader (3) java.xml.stream.XMLEventReader

【问题讨论】:

    标签: java xml xml-parsing


    【解决方案1】:

    难道不是因为你没有声明 ó ("uacute") 吗? 可能是这样的:

    <!DOCTYPE definition [<!ENTITY oacute "&#243;">]>
    

    【讨论】:

    • 你可以这样做,但是你必须在那里添加所有可能的实体,而且有很多。我认为手动维护它们不是一个好主意。这样做你就不需要 XMLResolver。我希望 XMLResolver 使用第三方工具来解析实体。
    • 您在哪里使用第三方工具?我想,我不明白你的问题。
    • 嗨@Sara,为了简单起见,我没有在这个例子中使用它,因为它不是问题的一部分。在这里,我只是返回“huehey!!”对于到达的任何实体。
    猜你喜欢
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 2019-01-14
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多