Java : EntityResolver#Resolveentity (String Publicid, String SystemID)에서 'SystemID'를 방지하는 방법은 현재 작업 디렉토리로 절대화되지 않도록합니다.

StackOverflow https://stackoverflow.com/questions/1648291

문제

모든 엔티티를 해결하기 위해 다음 XML 문서를 구문 분석하고 싶습니다.

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

내 EntityResolver는 데이터베이스에서 주어진 시스템 ID로 외부 엔티티를 가져와 해상도를 수행해야합니다. 아래 그림을 참조하십시오.

 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)를 사용하여 시도했고 엔티티 리졸버를 myentityResolver로 설정했습니다 (예 : setEntityResolver(new MyEntityResolver())), 하지만 systemId 안에 MyEntityResolver#resolveEntity(String publicId, String systemId) 항상 현재 작업 디렉토리로 절대화되고 있습니다.

나는 또한 전화를 시도했다 setFeature("http://xml.org/sax/features/resolve-dtd-uris", false);, 그러나 그것은 아무것도 도움이되지 않았습니다.

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

감사!

도움이 되었습니까?

해결책

분명히 다른 인터페이스가 호출되어 있습니다 EntityResolver2 그것은 오래된 것의 확장입니다 EntityResolver. (혼란스러운 이름에 대해 이야기하십시오!)

어쨌든, 나는 그것을 발견했다 EntityResolver2 내가 원하는 것을 달성 한 것, 즉, 그것은 systemId, 따라서 항상 XML 문서에 지정된 내용이됩니다.

다른 팁

에서 EntityResolver Javadocs:

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

또한, org.xml.sax 문서 Resolve-DTD-Uris 기능에 대해 다음과 같이 말하십시오.

EntityResolver.resolventity ()에는 적용되지 않으며 선언을보고하는 데 사용되지 않습니다 ...

나는 당신이 당신이 살 수있는 무언가로베이스 오리를 설정하거나 시스템 ID 대신 공개 ID를 사용해야한다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top