【发布时间】: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 ó 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() 被执行时,它会抛出异常
第一:我不知道为什么 MyXMLResolver 没有解析实体
第二个:为什么在最后一个next()而不是前一个中引发了异常?因为文本是在上一个中解析的。
PS:我将resolveEntity(...) 设为返回InputStream,因为该方法的文档说:
检索资源。该资源可以是以下三种返回类型:(1) java.io.InputStream (2) javax.xml.stream.XMLStreamReader (3) java.xml.stream.XMLEventReader
【问题讨论】:
标签: java xml xml-parsing