2012-04-03 2 views
2

StAX를 사용하여 XML 파일을 처리하고 있습니다. 이 문서는 DTD 파일에 DOCTYPE 참조가StAX 파서에 DTD 파일 제공

<!DOCTYPE onlineDoc SYSTEM "onlineDoc.dtd">

나는 (그것을 스트리밍하고) 인터넷에서 XML을 얻고, DTD 파일은 XML에 바로 옆에있다 (하지만 -는 XML과 같은 -에 원격 기계). StAX를 파서가 엔티티 Ntilde가 해결 될 수 없다는 예외가 발생하므로

이제 DTD는

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

내가 아직 DTD를 제공 해달라고 XML의 예에서 사용되는 일부 엔티티 선언을 포함 .

Q : DTD 파일을 파서에 제공하려면 어떻게해야합니까? (인터넷에서 스트림이 가능한 경우 가장 좋을 것입니다).

답변

2

모든 것이 훌륭합니다.

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 

메이븐 사용 :

<dependency> 
    <groupId>org.codehaus.woodstox</groupId> 
    <artifactId>woodstox-core-asl</artifactId> 
    <version>4.1.2</version> 
</dependency> 
다음 (봄에서 ClasspathResource 클래스를 사용) 내 조각이다