次の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(ie setEntityResolver(new MyEntityResolver())
)に設定しようとしましたが、systemId
inMyEntityResolver#resolveEntity(String publicId, String systemId)
は常に現在の作業ディレクトリに絶対化されています。
私も電話をかけてみsetFeature("http://xml.org/sax/features/resolve-dtd-uris", false);
ましたが、何の役にも立ちませんでした。
では、どうすれば私が望んでいたことを達成できますか?
ありがとう!