V pripade, ze by ste chcel ist este dalej a nechcel kodovat cestu k DTD
natvrdo do implementacie rozhrania "org.xml.sax.EntityResolver" mozete
vyriesit Vas problem prostrednictvom
http://xml.apache.org/commons/components/resolver/. Cela zmena by potom
pozostavala z pridania "resolver.jar" do CLASSPATH, konfiguracie CATALOG
RESOLVER-a, a nastavenia CATALOG RESOLVER-a pre DocumentBuilder
nasledujucim sposobom:
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbFactory.newDocumentBuilder();
docBuilder.setEntityResolver(new
org.apache.xml.resolver.tools.CatalogResolver());
document = docBuilder.parse(is);
V strucnosti, cela idea je taka, ze URI DTD je definovane v
konfiguracnom subore a parser pri parsovani XML dokumentu
prostrednictvom nastaveneho CATALOG RESOLVER-a ziska toto URI. Myslim
si, ze takto postavene riesenie sa vyznacuje vysokou flexibilitou zmeny
umiestnenia DTD bez potreby rekompilacie zdrojoveho kodu. Je dost mozne,
ze uprednostnite jednoduchsie riesenie zalozene na vlastnej
implementacii rozhrania "org.xml.sax.EntityResolver", kazdopadne nebude
na skodu veci ked budete vediet aj o tejto moznosti. V pripade, ze sa
rozhodnete ist cestou CATALOG RESOLVER-a, tak nasledujuce linky Vam budu
napomocne:
http://www.dallaway.com/acad/dtd/
http://www.xml.com/lpt/a/2004/03/03/catalogs.html
Ales
Michal Palička wrote:
Dobry den,
podivejte se do JavaDocu na tridu "org.xml.sax.EntityResolver".
Nacitani DTD z "nestandardniho" ulozite muzete vyresit implementaci
vlastniho resolveru.
V dokumentaci se pise:
If a SAX application needs to implement customized handling for external entities, it must implement this interface
and register an instance with the SAX driver using the setEntityResolver method.
The XML reader will then allow the application to intercept any external entities (including the external DTD subset
and external parameter entities, if any) before including them.
mp.
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Martin Javorek
Sent: Friday, August 26, 2005 5:47 PM
To: Java
Subject: Xerces a relativni DTD
Ahoj,
tak tu ted resim takovy problemek... Web aplikace (Tomcat 5.0), pri startu servletu se parsuji (DOM) nejaka XML (Xerces 2.0.7). Ta XML maji relativni cestu k DTD. Zjistil jsem vsak, ze cesta je zavisla na tom, odkud se spusti Tomcat - jinymi slovy, je relativni k /bin adresare Tomcatu a ne ke XML dokumentu. Samozrejme - aplikace funguje jen v pripade, ze se Tomcat spusti davkou z /bin, pokud jej spustim jinak a odjinud, tak nastane problem, protoze DTD se nenajdou. Kdyz predelam adresy DTD relativne k dokumentum, taktez to nefunguje.
Tak jsem to doho chvilu koukal a napadlo me, ze se to XML nacita pres stream a
tudiz validator parseru nema asi pristup k informaci, kde se vlastne dokument
nachazi a tudiz nemuze ani relativne k nemu najit to DTD... a clovek, ktery to
psal prede mnou to nejspis vyresil tak, ze tam placnul relativni cestu k tomu
binu a hotovo (coz mi zrovna nevyhovuje).
Utrzek kodu parsovani toho XML:
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbFactory.newDocumentBuilder();
document = docBuilder.parse(is);
kde is je inputstream toho XML
Jak bych mel rict tomu parseru, kde ten dokument lezi? Nejaka base URL/URI?
Nebo je to uplne spatne?
Diky.
Martin