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