2009-10-30 3 views
7

에 절대화되는 것을의 EntityResolver # 것으로 resolveEntity에서 '시스템 ID'(문자열 주어, publicId, 문자열 시스템 ID)를 방지하기 위해 어떻게하면 모든 엔티티를 해결하기 위해 다음과 같은 XML 문서를 구문 분석 할 :자바 : 현재 작업 디렉토리

<!DOCTYPE doc SYSTEM 'mydoc.dtd'> 
<doc>&title;</doc> 

private static class MyEntityResolver 
{ 
    public InputSource resolveEntity(String publicId, String systemId) 
     throws SAXException, IOException 
    { 
     // At this point, systemId is always absolutized to the current working directory, 
     // even though the XML document specified it as relative. 
     // E.g. "file:///H:/mydoc.dtd" instead of just "mydoc.dtd" 
     // Why??? How can I prevent this??? 

     SgmlEntity entity = findEntityFromDatabase(systemId); 
     InputSource is = new InputSource(new ByteArrayInputStream(entity.getContents())); 
     is.setPublicId(publicId); 
     is.setSystemId(systemId); 
     return is; 
    } 
} 

내가 모두 사용하여 DOM (DocumentBuilder를) 및 SAX (의 XMLReader를) 시도 :

내의 EntityResolver는 데이터베이스에서 주어진 시스템의 ID와 외부 엔티티를 가져올 것으로 예상되는 다음 해상도, 그림은 아래를 참조 할 엔티티 리졸버를 MyEnt로 설정합니다. ityResolver (즉, setEntityResolver(new MyEntityResolver())), MyEntityResolver#resolveEntity(String publicId, String systemId)systemId은 항상 현재 작업 디렉토리로 절대화됩니다.

나는 또한 setFeature("http://xml.org/sax/features/resolve-dtd-uris", false);을 호출 해 보았지만 아무런 도움이되지 못했습니다.

그래서 내가 원하는 것을 어떻게 얻을 수 있습니까?

감사합니다. the EntityResolver Javadocs에서

답변

7

외관상으로는 EntityResolver의 확장 인 EntityResolver2이라는 또 다른 인터페이스가 있습니다. (혼란스러운 이름에 대해 이야기하십시오.)

어쨌든 EntityResolver2은 내가 원하는 바를 얻었습니다. 즉, systemId을 변경하지 않았으므로 항상 XML 문서에 지정된 내용이됩니다.

0

:

시스템 식별자가 URL 인 경우, SAX 파서는 응용 프로그램에보고하기 전에 완전히 를 해결해야합니다.

그것은 선언을보고하는 데 사용되지 않습니다 의 EntityResolver2.resolveEntity()에 적용되지 않습니다

또한, org.xml.sax docs이가 해결-DTD-URI의 기능에 대해 말해야한다. ..

나는 당신이 살 수있는 것으로 당신의 base-URI를 설정했거나 system-IDs 대신에 public-IDs를 사용해야한다고 생각한다.

관련 문제