向StAX解析器提供DTD文件

时间:2012-04-03 08:59:50

标签: java xml dtd stax

我正在使用StAX处理XML文件。该文档具有对dtd文件的DOCTYPE引用

<!DOCTYPE onlineDoc SYSTEM "onlineDoc.dtd">

我从互联网上获取XML(流式传输),DTD文件就在XML旁边(但是 - 就像xml一样 - 在远程机器上)。

现在DTD包含一些在XML中使用的实体声明,即

<!ENTITY Ntilde "&#209;" ><!-- capital N, tilde -->

我还没提供DTD,所以StAX解析器会抛出一个异常,说明无法解析实体Ntilde。

问:我如何将DTD文件提供给解析器(如果它可能是来自互联网的流,那将是最好的。)

1 个答案:

答案 0 :(得分:2)

Woodstox一切都很好。这是我的代码片段(使用Spring的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 &Ntilde; b</test>
</onlineDoc>

打印:

a Ñ b

在Maven中使用:

<dependency>
   <groupId>org.codehaus.woodstox</groupId>
   <artifactId>woodstox-core-asl</artifactId>
   <version>4.1.2</version>
</dependency>