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...