[XML-DEV Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: How to open XML file that reference entity resolver (DTD)
The entity resolver I wrote for Kernow is here: http://kernowforsaxon.svn.sourceforge.net/viewvc/kernowforsaxon/kernow/trunk/src/net/sf/kernow/transform/CustomEntityResolver.java?revision=256&view=markup That will check a local directory first, then the store in memory, falling back to getting the doc itself. To use it: xmlReader.setEntityResolver(CustomerEntityResolver.getInstance()) cheers andrew On 30 June 2010 15:23, Jack Bush <netbeansfan@yahoo.com.au> wrote: > Hi Liam, > > I took up your 3rd suggestion by overriding the default entity resolver by creating LocalDTDResolver.java as follows: > > public class LocalDTDResolver implements EntityResolver { > String mySystemIdToIntercept; > File myLocalDtdPath; > URL localDtdFileAsUrl; > public LocalDTDResolver( String systemIdToIntercept, File localDtdPath ) throws MalformedURLException { > mySystemIdToIntercept = systemIdToIntercept; > myLocalDtdPath = localDtdPath; > localDtdFileAsUrl = myLocalDtdPath.toURI().toURL(); > } > public InputSource resolveEntity (String publicId, String systemId) { > if (systemId.equals( mySystemIdToIntercept )) { > return new InputSource( localDtdFileAsUrl.toString() ); > } > else { > // use the default behaviour (?) > return null; > } > } > } > MyApplication.java > ..... > LocalDTDResolver localDTDResolver = > new LocalDTDResolver("http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", > new File("E:\\Tmp\\xhtml1-transitional.dtd")); // Place xhtml1-transitional.dtd in E:\ > SAXBuilder saxBuilder = new SAXBuilder(false); > saxBuilder.setEntityResolver(localDTDResolver); > cityJDOMDocument = saxBuilder.build(new BufferedReader(new FileReader("C:\City.xml"))); > ...... > > However, it appears that the LocalDTDResolver class is partly working by generating the following different error: > > java.io.FileNotFoundException: E:\Tmp\xhtml-lat1.ent (The system cannot find the file specified) > at java.io.FileInputStream.open(Native Method) > at java.io.FileInputStream.<init>(FileInputStream.java:106) > at java.io.FileInputStream.<init>(FileInputStream.java:66) > at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:70) > at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:161) > at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:653) > at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1315) > at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1252) > at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.startPE(XMLDTDScannerImpl.java:722) > at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.skipSeparator(XMLDTDScannerImpl.java:2068) > at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.scanDecls(XMLDTDScannerImpl.java:2031) > at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.scanDTDExternalSubset(XMLDTDScannerImpl.java:320) > at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(XMLDocumentScannerImpl.java:1202) > at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(XMLDocumentScannerImpl.java:1090) > at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:1003) > at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) > at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) > at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) > at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807) > at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) > at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107) > at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) > at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) > at org.jdom.input.SAXBuilder.build(SAXBuilder.java:489) > at org.jdom.input.SAXBuilder.build(SAXBuilder.java:888) > > Do I need to put xhtml-lat1.ent (where from?) to E:\Tmp as well? And how to include it in LocalDTDResolver class as well? > > Btw, is Apache xml-commons-resolver-1.2 needed to be included in the CLASSPATH for this solution to work? > Thanks again, > Jack > > ----- Original Message ---- > From: Liam R E Quin <liam@w3.org> > To: Jack Bush <netbeansfan@yahoo.com.au> > Cc: xml-dev@lists.xml.org > Sent: Tue, 29 June, 2010 11:36:44 PM > Subject: Re: How to open XML file that reference entity resolver (DTD) > > On Tue, 2010-06-29 at 01:00 -0700, Jack Bush wrote: > [...] > >> Looks like it is the default Sax parser possibly via JAXP that does >> not come with the XHTML DTDs and with an XML catalog set up to use >> them instead of going to www.w3.org each time. >> I am still waying through the references to use XML Catalog but it >> doesn't appears to provide every facets to a Java solution. It would >> great if you could provide some example of how everything are >> interconnected together. > > When the XML parser sees it needs to fetch an external entity such as > the document type definition, it gets a SYSTEM identifier, and often (as > in this case) a PUBLIC identifier too. > > There is a piece of code that maps the (PUBLIC, SYSTEM) pair into a data > stream. This code is usually called the entity resolver. > > The default entity resolver will look up the SYSTEM and PUBLIC > identifiers in an external file, an XML Catalog, to see if they map > to a pre-configured local copy. > > If not, the default entity resolver will treat the SYSTEM identifier as > a URI (relative to the actual document in which it occurred, just like a > link in an HTML document) and try to fetch it. > > So you have several choices to avoid network access: > (1) add entries to the system XML Catalog > (2) add your own XML Catalog file > (3) override the default entity resolver > (4) edit the document. > >> The 3rd option you have suggested by turning off validation with >> SAXBuilder.setValidating(false) does not prevent the process of >> resolving DTD document. > OK. Others have said that too, although I've seen it work -- you do > probably want the DTD loaded, though, with XHTML, so that entities work. > > There are plenty of examples of options 1 to 3 floating around, using > Java. > > Liam > > -- > Liam Quin - XML Activity Lead, W3C, http://www.w3.org/People/Quin/ > Pictures from old books: http://fromoldbooks.org/ > Ankh: irc.sorcery.net irc.gnome.org www.advogato.org > > > _______________________________________________________________________ > > XML-DEV is a publicly archived, unmoderated list hosted by OASIS > to support XML implementation and development. To minimize > spam in the archives, you must subscribe before posting. > > [Un]Subscribe/change address: http://www.oasis-open.org/mlmanage/ > Or unsubscribe: xml-dev-unsubscribe@lists.xml.org > subscribe: xml-dev-subscribe@lists.xml.org > List archive: http://lists.xml.org/archives/xml-dev/ > List Guidelines: http://www.oasis-open.org/maillists/guidelines.php > > > > > > _______________________________________________________________________ > > XML-DEV is a publicly archived, unmoderated list hosted by OASIS > to support XML implementation and development. To minimize > spam in the archives, you must subscribe before posting. > > [Un]Subscribe/change address: http://www.oasis-open.org/mlmanage/ > Or unsubscribe: xml-dev-unsubscribe@lists.xml.org > subscribe: xml-dev-subscribe@lists.xml.org > List archive: http://lists.xml.org/archives/xml-dev/ > List Guidelines: http://www.oasis-open.org/maillists/guidelines.php > > -- Andrew Welch http://andrewjwelch.com Kernow: http://kernowforsaxon.sf.net/
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] |
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|