Thank you to both of you for your help and responses. I took the suggestion of adding an extra parameter for the filename to the constructor and that did the trick.
Thanks again! Nida On 7/29/08, Nathan Beyer <[EMAIL PROTECTED]> wrote: > > I'd suggest changing your DTDEntityResoler to accept a java.io.File in the > contructor or a file name and then construct and use a FileReader and > InputSource on the call to getExternalSubset. > > -Nathan > > On Tue, Jul 29, 2008 at 8:26 AM, Nida Duckett <[EMAIL PROTECTED]>wrote: > >> 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; } >>> > > > } >>> >>> >> >> > >
