2010-06-18 6 views
7

Utilizzo la libreria rpc xml del servizio Web Apache per effettuare richieste a un servizio rpc. Da qualche parte in questo processo c'è un documento xml con un riferimento DTD a http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd, che la libreria tenta di scaricare durante l'analisi dell'XML. Il download non riesce con un codice di stato 503 poiché il w3c blocca i download ripetuti di questo documento in gran parte statico dai client Java.Utilizzo di un catalogo XML con una libreria Java che utilizza internamente JAXP

La soluzione è cataloghi XML per memorizzare in cache la DTD. Tuttavia, mentre sono in grado di trovare esempi di impostazione di EntityHandler su un'istanza di JAXP SAXParser direttamente per abilitare il supporto del parser di catalogo, in realtà non ho accesso al parser sottostante. È solo usato dalla libreria rpc xml. Esiste un modo per impostare una proprietà globale o qualcosa che indichi a JAXP di utilizzare i cataloghi XML?

risposta

1

Penso che desideri la proprietà di sistema xml.catalog.files.

Date un'occhiata a http://xml.apache.org/commons/components/resolver/resolver-article.html

BTW, questo è stato il terzo colpo su una ricerca su Google per jaxp catalog

+0

avevo visto che in rete e ho già tentato di integrare XML-resolver nel mio progetto. Il problema è che la proprietà di sistema xml.catalog.files ha effetto solo dopo aver installato XML Resolver come resolver di entità nell'istanza del lettore JAXP. Il mio problema è che non ho accesso all'istanza del lettore JAXP utilizzata internamente dalla libreria dei servizi web. –

+0

Se si imposta quella proprietà sulla riga di comando all'avvio del programma, non viene "visto" dal parser factory? –

1

Purtroppo, impostando xml.catalog.files non ha alcun effetto sulla fabbrica parser. Idealmente dovrebbe, ovviamente, ma l'unico modo per usare un resolver è in qualche modo aggiungere un metodo che deleghi la risoluzione al risolutore di catalogo nel gestore che usa il parser SAX.

Se si sta già utilizzando un parser SAX, che è abbastanza facile:

final CatalogResolver catalogResolver = new CatalogResolver(); 
    DefaultHandler handler = new DefaultHandler() { 
     public InputSource resolveEntity (String publicId, String systemId) { 
      return catalogResolver.resolveEntity(publicId, systemId); 
     } 
     public void startElement(String namespaceURI, String lname, String qname, 
      Attributes attrs) { 
      // the stuff you'd normally do 
     } 
     ... 
    }; 

    SAXParserFactory factory = SAXParserFactory.newInstance(); 
    factory.setNamespaceAware(true); 
    SAXParser saxParser = factory.newSAXParser(); 
    String url = args.length == 0 ? "http://horstmann.com/index.html" : args[0]; 
    saxParser.parse(new URL(url).openStream(), handler); 

caso contrario, sarà necessario capire se è possibile fornire il proprio risolutore entità. Con un javax.xml.parsers.DocumentBuilder, puoi farlo. Con l'oggetto scala.xml.XML, non si può, ma si può usare sotterfugi:

val res = new com.sun.org.apache.xml.internal.resolver.tools.CatalogResolver 

val loader = new factory.XMLLoader[Elem] { 
    override def adapter = new parsing.NoBindingFactoryAdapter() { 
    override def resolveEntity(publicId: String, systemId: String) = { 
     res.resolveEntity(publicId, systemId) 
    } 
    } 
} 

val doc = loader.load(new URL("http://horstmann.com/index.html"))enter code here 
Problemi correlati