Java: So verhindern Sie, dass 'systemId' in EntityResolver # resolveEntity (String publicId, String systemId) in das aktuelle Arbeitsverzeichnis absolutiert wird
Ich möchte das folgende XML-Dokument analysieren, um alle darin enthaltenen Entitäten aufzulösen:
<!DOCTYPE doc SYSTEM 'mydoc.dtd'>
<doc>&title;</doc>
Mein EntityResolver soll die externe Entität mit der angegebenen System-ID aus der Datenbank abrufen und dann die Auflösung vornehmen, siehe unten für eine Abbildung:
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;
}
}
Ich habe versucht, sowohl mit DOM (DocumentBuilder) als auch mit SAX (XMLReader) den Entity-Resolver auf MyEntityResolver (d. H.setEntityResolver(new MyEntityResolver())
), abersystemId
imMyEntityResolver#resolveEntity(String publicId, String systemId)
wird immer in das aktuelle Arbeitsverzeichnis absolutiert.
Ich habe auch versucht anzurufensetFeature("http://xml.org/sax/features/resolve-dtd-uris", false);
, aber das hat nichts geholfen.
Wie kann ich also erreichen, was ich wollte?
Vielen Dank!