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

Reply via email to