Java: Wie um zu verhindern, 'systemId' in EntityResolver # ResolveEntity (String publicId, String systemId) zu aktuellen Arbeitsverzeichnis verabsolutiert werden
-
22-07-2019 - |
Frage
Ich möchte das folgende XML-Dokument analysieren, alle Objekte in ihm zu lösen:
<!DOCTYPE doc SYSTEM 'mydoc.dtd'>
<doc>&title;</doc>
Meine EntityResolver sollte die externe Einheit mit der angegebenen System-ID aus der Datenbank holen und führen Sie dann die Auflösung, siehe unten für eine Darstellung:
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;
}
}
habe ich versucht, beide unter Verwendung von DOM (Document) und SAX (XMLReader), stellen Sie die Einheit Resolver MyEntityResolver (d setEntityResolver(new MyEntityResolver())
), aber systemId
in MyEntityResolver#resolveEntity(String publicId, String systemId)
immer wird auf dem aktuellen Arbeitsverzeichnis verabsolutiert.
Ich habe auch versucht setFeature("http://xml.org/sax/features/resolve-dtd-uris", false);
nennen, aber das half nichts.
Wie kann ich erreichen, was ich wollte?
Danke!
Lösung
Offenbar gibt es eine weitere Schnittstelle EntityResolver2 , die die Erweiterung des alten
Andere Tipps
Wenn die Systemkennung ist eine URL, die SAX-Parser muss lösen sie vollständig bevor es an die Berichterstattung Anwendung.
Auch die org. xml.sax docs diese über die Auflösungs-dtd-uris Funktion sagen:
Es gilt nicht für EntityResolver.resolveEntity (), die verwendet Erklärungen nicht zu berichten ...
Ich glaube, du hast entweder bekam Ihre Basis-URI, um etwas zu setzen Sie mit leben können, oder verwenden Sie öffentlich-IDs anstelle von System-IDs.