[XML-DEV Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: External subset processing by browsers
Hi Andrew, Sorry, I spoke too soon. This works in oXygen and I thought it was just this feature... but we actually needed to work low level for that. One trick that you can use is to take advantage of the fact that a parser in non validating mode is not required to actually read the DTD. You need to have a DTD specified though in the XML file. You will get the entity notification on the ContentHandler skippedEntity callback. See for instance the following class that gives the output below: file:///D:/users/george/workspace/test/foo.dtd Start ent: [dtd] End ent: [dtd] Skipped entity: euro import java.io.IOException; import java.io.StringReader; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.ext.LexicalHandler; import org.xml.sax.helpers.XMLFilterImpl; import org.xml.sax.helpers.XMLReaderFactory; public class Test extends XMLFilterImpl implements LexicalHandler { public static void main(String[] args) throws Exception { new Test(); } public Test() throws Exception { String xml = "<!DOCTYPE foo SYSTEM 'foo.dtd'><foo>foo € bar</foo>"; XMLReader xmlReader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler", this); xmlReader.setEntityResolver(this); xmlReader.setContentHandler(this); xmlReader.parse(new InputSource(new StringReader(xml))); } public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { System.out.println(systemId); return new InputSource(new StringReader("")); } public void startDocument() throws SAXException { super.startDocument(); } public void skippedEntity(String name) throws SAXException { System.out.println("Skipped entity: " + name); } public void startEntity(String name) throws SAXException { System.out.println("Start ent: " + name); } public void endEntity(String name) throws SAXException { System.out.println("End ent: " + name); } public void startCDATA() throws SAXException {} public void endCDATA() throws SAXException {} public void startDTD(String name, String publicId, String systemId) throws SAXException {} public void endDTD() throws SAXException {} public void comment(char[] ch, int start, int length) throws SAXException {} } Or you can just remove the fake resolver and use instead: xmlReader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); that will give you as output Skipped entity: euro Hope that helps, George -- George Cristian Bina <oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger http://www.oxygenxml.com Andrew Welch wrote: > Hi George, > > 2008/12/8 George Cristian Bina <george@o...>: >> Try setting http://xml.org/sax/features/external-general-entities to false. >> See also: >> http://xerces.apache.org/xerces2-j/features.html#external-general-entities > > Thanks, but same result. > > Should this work? (maybe a problem with that verison of Xerces) Or > will it never work because of some fundamental dtd concept that > sgml'ers all treat as common knowledge? :) > > >
[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
|