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; }
> > > > }

Reply via email to