2012-04-03 87 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>