2012-04-03 88 views
2

我正在使用StAX来处理XML文件。文档有一个DOCTYPE引用DTD文件向StAX解析器提供DTD文件

<!DOCTYPE onlineDoc SYSTEM "onlineDoc.dtd">

我从(我流吧)互联网的XML和DTD文件就位于旁边的XML(但 - 像XML - 上远程机器)。

现在DTD包含了一些实体的声明,即在XML即

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

我不提供DTD尚未使用,因此StAX的解析器抛出一个异常说,实体Ntilde不能得到解决。

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

回答

2

随着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 &Ntilde; b</test> 
</onlineDoc> 

打印:

Maven中使用
a Ñ b 

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