2012-04-03 9 views
2

私はStAXを使用してXMLファイルを処理しています。 XMLのような - - 上の文書は、私は、インターネット(それをストリーミングしています)からXMLを取得し、DTDファイルはすぐ隣XMLにある(しかしStAXパーサーにDTDファイルを提供

<!DOCTYPE onlineDoc SYSTEM "onlineDoc.dtd">

DTDファイルにDOCTYPE参照を持っていますリモートマシン)。

今DTDが、私はまだDTDを提供いけないので、StAXのパーサがエンティティNtildeは解決できないという例外がスローされたXMLすなわち

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

で使用されるいくつかの実体宣言を含み、 。

Q:DTDファイルをパーサーに提供するにはどうすればいいですか(それはインターネットからのストリームでも可能です)。

答えて

2

すべてがうまくいきます。ここでは(春から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> 
関連する問題