Yes, that is the problem and I already described the solution. You need to create a new FileReader each time resolveEntity() is called. Don't try to reuse these objects. As you've noticed, that approach doesn't work.
Thanks. Michael Glavassevich XML Parser Development IBM Toronto Lab E-mail: [EMAIL PROTECTED] E-mail: [EMAIL PROTECTED] "Nida Duckett" <[EMAIL PROTECTED]> wrote on 07/29/2008 09:26:12 AM: > Thank you for your quick response. > > The problem is that in my EntityResolver, I don't create a new > FileReader. I create a new FileReader only when I construct the > EntityResolver, and that is only done once during initialization. > When I submit the first input XML file, it returns the expected > validation errors. When I submit a second XML file (the same one), > the code encounters this error: > > javax.xml.transform.TransformerException: java.io.IOException: Stream closed > Here is my code (please forgive how amateur it is -- I am new to this). > > final String ENTITY_RESOLVER_2_ID = "http://xml. > org/sax/features/use-entity-resolver2"; > SAXParserFactory factory = SAXParserFactory.newInstance(); > factory.setFeature(ENTITY_RESOLVER_2_ID, true); > factory.setValidating( true ); > SAXParser parser = factory.newSAXParser(); > > reader = parser.getXMLReader(); > reader.setEntityResolver(new DTDEntityResolver(new FileReader("MYDTD.dtd"))); > reader.setFeature( "http://xml.org/sax/features/validation", true ); > ... > > And here is the EntityResolver class definition : > public class DTDEntityResolver implements EntityResolver2 > { > InputSource input; > public DTDEntityResolver(Reader dtd) { input = new InputSource(dtd); } > public InputSource getExternalSubset(String name, String baseURI) > throws SAXException { return input; } > public InputSource resolveEntity(String publicId, String systemId) > { return null; } > public InputSource resolveEntity(String name, String publicId, > String baseURI, > String systemId) throws SAXException { return null; } > } > > Any help would be appreciated. Thanks in advance. > Nida > > > > On 7/28/08, Michael Glavassevich <[EMAIL PROTECTED]> wrote: > Hello Nida, > > In general InputStream and Reader objects can only be consumed once. > You should create and return a new FileReader (or whatever) each > time your EntityResolver is called. > > Thanks. > > Michael Glavassevich > XML Parser Development > IBM Toronto Lab > E-mail: [EMAIL PROTECTED] > E-mail: [EMAIL PROTECTED] > > "Nida Duckett" <[EMAIL PROTECTED]> wrote on 07/28/2008 04:33:21 PM: > > > Hello, > > > > > I am trying to set up a SAXParser to parse and validate any input > > XML file that contains both DOCTYPE and no DOCTYPE definitions using > > a DTD that I specify. After combing through the mailing list > > archives, I was able to get it working (thanks to posting > > 9e9da3a00702250947n1571e875g92fbe3aa030b23c7 () mail ! gmail ! com). > > > > However, the posting also warned about it only works for one > > document and will not work for subsequent documents. I was > > wondering if any workaround or fix has been found to resolve that issue. > > > > Thanks in advance. > > > > Nida > > > > Here is the thread from that old posting for reference: > > > > List: xerces-j-dev > > Subject: Re: Specifying a DTD file when parsing XML files that > > don't contain !DOCTYPE lines > > From: "Will Holcomb" <wholcomb () gmail ! com> > > Date: 2007-02-25 17:47:29 > > Message-ID: 9e9da3a00702250947n1571e875g92fbe3aa030b23c7 () mail ! > gmail ! com > > [Download message RAW] > > > > One more note about a bug I found in this code. It only works once. When you > > parse a second document, you get an exception because the FileReader for the > > DTD has already been closed. > > > > Will Holcomb > > > > On 2/25/07, Will Holcomb <[EMAIL PROTECTED]> wrote: > > > > > > I happened to send a message to this list asking this exact question > > > > earlier this week. I figure I'll pass on the kindness someone > > showed me and > > > > answer it this time/ (Perhaps this should go in the FAQ because it isn't > > > > really intuitive.) > > > > > > > > final static String ENTITY_RESOLVER_2_ID = "http://xml. > > org/sax/features/use-entity-resolver2"; > > > > > > > > DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); > > > > dbFactory.setFeature(ENTITY_RESOLVER_2_ID, true); > > > > DocumentBuilder builder = dbFactory.newDocumentBuilder(); > > > > builder.setEntityResolver(new DTDEntityResolver(new > > > > FileReader(dtdFilename))); > > > > > > > > public class DTDEntityResolver implements EntityResolver2 { > > > > InputSource input; > > > > public DTDEntityResolver(Reader dtd) { input = new InputSource(dtd); } > > > > public InputSource getExternalSubset(String name, String baseURI) > > > > > > throws SAXException { return input; } > > > > public InputSource resolveEntity(String publicId, String > > systemId) {return null;} > > > > public InputSource resolveEntity(String name, String publicId, String > > > > baseURI, String systemId) > > > > throws SAXException { return null; } > > > > }