Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    JDOM - XML - Problema con DTDHandler

    Per chi conosce la libreria in questione, che serve per gestire documenti XML, ho un problema con la classe Document. Praticamente avvia il parsing solamente se sono connesso a internet, perché cerca di collegarsi al link che c'è nel file XML per scaricare il DTD Handler. Come posso impedire di fare ciò? E poi non ho ben capito cosa è un DTD Handler...

    Il DTD Handler in questione si trova all'indirizzO: http://www.apple.com/DTDs/PropertyList-1.0.dtd

    Nella classe SAXBuilder, c'è un metodo che si chiama "SetDTDHandler()" che richiede un oggettto org.xml.sax.DTDHandler ma che non so come istanziarlo.

    Se qualcuno conosce come fare può dirmelo? Grazie

  2. #2

    Re: JDOM - XML - Problema con DTDHandler

    Originariamente inviato da ardito86
    Per chi conosce la libreria in questione, che serve per gestire documenti XML, ho un problema con la classe Document. Praticamente avvia il parsing solamente se sono connesso a internet, perché cerca di collegarsi al link che c'è nel file XML per scaricare il DTD Handler. Come posso impedire di fare ciò? E poi non ho ben capito cosa è un DTD Handler...

    Il DTD Handler in questione si trova all'indirizzO: http://www.apple.com/DTDs/PropertyList-1.0.dtd

    Nella classe SAXBuilder, c'è un metodo che si chiama "SetDTDHandler()" che richiede un oggettto org.xml.sax.DTDHandler ma che non so come istanziarlo.

    Se qualcuno conosce come fare può dirmelo? Grazie
    Ciao, tempo fa ho risolto per lavoro un problema simile al tuo ma con Dom4J, ho usato spesso anche JDom ma non ho un esempio buono per te con quest'ultimo, in ogni modo non dovrebbe cambiare nulla.
    Per evitare che la libreria tenti di effettuare validazioni scaricando al volo da internet i dtd e gli schema per farlo hai due strade, spegnere completamente le validazioni (ma non è sempre il massimo ) oppure implementare da te un entity resolver (nel tuo caso un DTDhandler ma non penso cambi molto)

    Con Dom4J un esempio del primo approccio è
    codice:
    reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
     reader.setValidation(false);
    un esempio del secondo è
    codice:
    public void aMethod()
    {
    .....
    SAXReader reader = new SAXReader();
    reader.setEntityResolver(new MyEntityResolver());
    .....
    }
    
    private class MyEntityResolver implements EntityResolver {
    		public final String resolvePath = ConfigurationManager.getInstance().getProperty("dtd.cache.path");
    
    		@Override
    		public InputSource resolveEntity(String publicId, String systemId) {
    			String p = getClass().getClassLoader().getResource(resolvePath + systemId.substring(systemId.lastIndexOf('/'))).getPath();
    			if(!p.equals("")) {
    				return new InputSource(getClass().getClassLoader().getResourceAsStream(resolvePath + systemId.substring(systemId.lastIndexOf('/'))));
    			}
    			return null;
    		}
    	}
    nell'esempio sopra "dtd.cache.path" è il percorso di una directory situata nel classpath contenente i dtd e gli schema che per la validazione in questione la libreria tenta di scaricare dalla rete. La cartella è stata precedentemente riempita con i suddetti files scaricati a mano, e come si vede il mio resolver istruisce il parser a cercarli in tale cartella e non in remoto.
    Un approccio meno impattante ma non sempre praticabile è quello di modificare a mano il file da validare e fare in modo che non utilizzi url assoluto nell'intestazione. Non è sempre praticabile perché il file da validare è spesso il risultato di un download e quindi non è modificabile a mano a compile time, inoltre spesso un dtd o schema linkato direttamente dal file da validare nel linka altri (in rete) a sua volta...
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  3. #3
    Grazie...mmh ok
    ..vedrò di usare il primo metodo con dom4j....tanto alla fine devo cambiare poche istruzioni
    Il programma l'ho già finito(uno scrobbler per ipod utilizzando la libreria musicale di iTunes) manca solo questo piccolo particolare.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.