Java: Wie um zu verhindern, 'systemId' in EntityResolver # ResolveEntity (String publicId, String systemId) zu aktuellen Arbeitsverzeichnis verabsolutiert werden

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

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!

War es hilfreich?

Lösung

Offenbar gibt es eine weitere Schnittstelle EntityResolver2 , die die Erweiterung des alten

Andere Tipps

die EntityResolver Javadocs

  

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top