Java : EntityResolver#Resolveentity (String Publicid, String SystemID)에서 'SystemID'를 방지하는 방법은 현재 작업 디렉토리로 절대화되지 않도록합니다.
-
22-07-2019 - |
문제
모든 엔티티를 해결하기 위해 다음 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 문서에 지정된 내용이됩니다.
다른 팁
시스템 식별자가 URL 인 경우 SAX 파서는 응용 프로그램에보고하기 전에이를 완전히 해결해야합니다.
또한, org.xml.sax 문서 Resolve-DTD-Uris 기능에 대해 다음과 같이 말하십시오.
EntityResolver.resolventity ()에는 적용되지 않으며 선언을보고하는 데 사용되지 않습니다 ...
나는 당신이 당신이 살 수있는 무언가로베이스 오리를 설정하거나 시스템 ID 대신 공개 ID를 사용해야한다고 생각합니다.