向StAX解析器提供DTD文件
问题描述:
我正在使用StAX来处理XML文件。文档有一个DOCTYPE引用DTD文件向StAX解析器提供DTD文件
<!DOCTYPE onlineDoc SYSTEM "onlineDoc.dtd">
我从(我流吧)互联网的XML和DTD文件就位于旁边的XML(但 - 像XML - 上远程机器)。
现在DTD包含了一些实体的声明,即在XML即
<!ENTITY Ntilde "Ñ" ><!-- capital N, tilde -->
我不提供DTD尚未使用,因此StAX的解析器抛出一个异常说,实体Ntilde不能得到解决。
问:我如何向解析器提供DTD文件(最好是,如果它可能是来自互联网的流)。
答
随着Woodstox一切都很好。这里是我的代码段(使用ClasspathResource
类从春):
XMLInputFactory xif = XMLInputFactory.newFactory();
xif.setXMLResolver(new XMLResolver() {
@Override
public Object resolveEntity(String publicID, String systemID, String baseURI, String namespace) throws XMLStreamException {
try {
if ("onlineDoc.dtd".equals(systemID))
return new ClassPathResource(systemID, getClass()).getInputStream();
}
catch (IOException e) {
return null;
}
return null;
}
});
XMLStreamReader reader = xif.createXMLStreamReader(new ClassPathResource("a.xml", this.getClass()).getInputStream());
while (reader.hasNext()) {
reader.next();
if (reader.isCharacters())
log.info(new String(reader.getTextCharacters()));
}
它的工作原理和:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE onlineDoc SYSTEM "onlineDoc.dtd">
<onlineDoc>
<test>a Ñ b</test>
</onlineDoc>
打印:
Maven中使用a Ñ b
:
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>woodstox-core-asl</artifactId>
<version>4.1.2</version>
</dependency>