Java: Comment empêcher 'systemId' dans EntityResolver # resolEntity (String publicId, String systemId) d'être absolu dans le répertoire de travail en cours

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

Question

Je souhaite analyser le document XML suivant pour résoudre toutes les entités qu'il contient:

 <!DOCTYPE doc SYSTEM 'mydoc.dtd'>
 <doc>&title;</doc>

Mon EntityResolver est supposé extraire de la base de données l'entité externe avec l'ID système donné, puis effectuer la résolution. Voir ci-dessous pour un exemple:

 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;
    }
 }

J'ai essayé d'utiliser DOM (DocumentBuilder) et SAX (XMLReader). Définissez le résolveur d'entités sur MyEntityResolver (c'est-à-dire setEntityResolver (new MyEntityResolver ()) ), mais systemId . dans MyEntityResolver # resolEntity (String publicId, String systemId) est toujours absolutisé dans le répertoire de travail en cours.

J'ai aussi essayé d'appeler setFeature (" http: //xml.org/sax/features/resolve-dtd-uris" ;, false); , mais cela n'a rien aidé.

Alors, comment puis-je atteindre ce que je voulais?

Merci!

Était-ce utile?

La solution

Apparemment, il existe une autre interface appelée EntityResolver2 , qui est l'extension de l'ancien EntityResolver . (Parlez de noms déroutants!)

Quoi qu'il en soit, j'ai constaté que EntityResolver2 a obtenu ce que je voulais, c'est-à-dire qu'il n'apporte aucune modification à systemId , donc ce sera toujours exactement ce qui a été spécifié. dans le document XML.

Autres conseils

De EntityResolver Javadocs <> / a>:

  

Si l'identifiant du système est une URL, le   L'analyseur SAX doit le résoudre complètement   avant de le signaler à la   application.

De même, le org. Les documents xml.sax ont ceci à dire à propos de la fonctionnalité resol-dtd-uris:

  

Cela ne s'applique pas à   EntityResolver.resolveEntity (), qui   n'est pas utilisé pour signaler des déclarations ...

Je pense que vous devez soit définir votre URI de base sur quelque chose avec lequel vous pouvez vivre, soit utiliser des identifiants publics au lieu de des identifiants système.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top