You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by Yueming Xu <yx...@vitria.com> on 2001/10/17 21:46:50 UTC

How to setEntityResolver when XMLFilter is used?

In the following code, I tried to use my DummyEntityResolver, so it won't check for the existence of the DTD file for the incoming XML.  However, it does not work.  It always tries to resolve the DTD file.  What is wrong with this code?

Thanks,
Yueming

// Setup reusable templates
TransformerFactory tFactory =TransformerFactory.newInstance();
Templates template1 = tFactory.newTemplates(new StreamSource(stylesheet1));
Templates template2 = tFactory.newTemplates(new StreamSource(stylesheet2));

// Set up to read the input file
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware( true );
spf.setValidating( false );
SAXParser parser = spf.newSAXParser();
XMLReader reader = parser.getXMLReader();
reader.setEntityResolver(new DummyEntityResolver());

// Set up the output stream
StreamResult result = new StreamResult("result.txt");
// Set up the input stream
BufferedInputStream bis = 
new BufferedInputStream(new FileInputStream(datafile));
SAXTransformerFactory stf = (SAXTransformerFactory) tFactory;
XMLFilter filter1 = stf.newXMLFilter(template1);
XMLFilter filter2 = stf.newXMLFilter(template2);
filter1.setParent(reader);
filter2.setParent(filter1);

Transformer transformer = stf.newTransformer();
SAXSource transformSource = new SAXSource(filter2, new InputSource(bis));
transformer.transform(transformSource, result);

Re: How to setEntityResolver when XMLFilter is used?

Posted by Yueming Xu <yx...@vitria.com>.
I attached a simple test program and data files.  When I ran it, I got the
following stack trace, I figured that TrAXFilter.parse() resets the
XMLReader's EntityResolver to that of the downflow filters, which is really
the default resolver.  Thus, my setEntityResolver() is ignored.

Thanks,
Yueming

** Transformation error
   File "file:///C:/work/consulting/src/xslt/xalanbug/foo.dtd" not found.
org.xml.sax.SAXParseException: File
"file:///C:/work/consulting/src/xslt/xalanbug/foo.dtd" not found.
        at
org.apache.xerces.framework.XMLParser.reportError(XMLParser.java:1202)
        at
org.apache.xerces.readers.DefaultEntityHandler.startReadingFromExternalEntit
y(DefaultEntityHandler.java:788)
        at
org.apache.xerces.readers.DefaultEntityHandler.startReadingFromExternalSubse
t(DefaultEntityHandler.java:566)
        at
org.apache.xerces.framework.XMLDTDScanner.scanDoctypeDecl(XMLDTDScanner.java
:1139)
        at
org.apache.xerces.framework.XMLDocumentScanner.scanDoctypeDecl(XMLDocumentSc
anner.java:2145)
        at
org.apache.xerces.framework.XMLDocumentScanner.access$0(XMLDocumentScanner.j
ava:2100)
        at
org.apache.xerces.framework.XMLDocumentScanner$PrologDispatcher.dispatch(XML
DocumentScanner.java:831)
        at
org.apache.xerces.framework.XMLDocumentScanner.parseSome(XMLDocumentScanner.
java:381)
        at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:1081)
        at
org.apache.xalan.transformer.TrAXFilter.parse(TrAXFilter.java:134)
        at
org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerId
entityImpl.java:452)
        at FilterChain.main(FilterChain.java:75)


----- Original Message -----
From: "Gary L Peskin" <ga...@firstech.com>
To: <xa...@xml.apache.org>; "'Yueming Xu'" <yx...@vitria.com>
Sent: Monday, October 22, 2001 9:50 AM
Subject: RE: How to setEntityResolver when XMLFilter is used?


> Do you have a stack trace from the error that occurs when the DTD file
> cannot be found?  This might provide a clue.  I just really don't have
> the time at the moment to try to recreate this here and think about
> what's going wrong.  But a stack trace might provide a quick hint.
>
> Gary
>
> -----Original Message-----
> From: Yueming Xu [mailto:yxu@vitria.com]
> Sent: Wednesday, October 17, 2001 12:47 PM
> To: xalan-dev@xml.apache.org
> Subject: How to setEntityResolver when XMLFilter is used?
>
>
> In the following code, I tried to use my DummyEntityResolver, so it
> won't check for the existence of the DTD file for the incoming XML.
> However, it does not work.  It always tries to resolve the DTD file.
> What is wrong with this code?
>
> Thanks,
> Yueming
>
> // Setup reusable templates
> TransformerFactory tFactory =TransformerFactory.newInstance();
> Templates template1 = tFactory.newTemplates(new
> StreamSource(stylesheet1));
> Templates template2 = tFactory.newTemplates(new
> StreamSource(stylesheet2));
>
> // Set up to read the input file
> SAXParserFactory spf = SAXParserFactory.newInstance();
> spf.setNamespaceAware( true );
> spf.setValidating( false );
> SAXParser parser = spf.newSAXParser();
> XMLReader reader = parser.getXMLReader();
> reader.setEntityResolver(new DummyEntityResolver());
>
> // Set up the output stream
> StreamResult result = new StreamResult("result.txt");
> // Set up the input stream
> BufferedInputStream bis =
> new BufferedInputStream(new FileInputStream(datafile));
> SAXTransformerFactory stf = (SAXTransformerFactory) tFactory;
> XMLFilter filter1 = stf.newXMLFilter(template1);
> XMLFilter filter2 = stf.newXMLFilter(template2);
> filter1.setParent(reader);
> filter2.setParent(filter1);
>
> Transformer transformer = stf.newTransformer();
> SAXSource transformSource = new SAXSource(filter2, new
> InputSource(bis));
> transformer.transform(transformSource, result);

Re: How to setEntityResolver when XMLFilter is used?

Posted by Yueming Xu <yx...@vitria.com>.
Yes, it works if you do not use XMLFilter.  Here is a code snip that makes
xalan not to check for dtd.

Thanks,
Yueming

        SAXTransformerFactory sFactory =
    (SAXTransformerFactory) tFactory;
        TransformerHandler handler
           = sFactory.newTransformerHandler(stylesource);
        handler.setResult(result);
     SAXParserFactory factory =
         SAXParserFactory.newInstance();
     factory.setNamespaceAware( true );
   factory.setValidating( false );
     SAXParser parser = factory.newSAXParser();
     XMLReader reader = parser.getXMLReader();
   reader.setEntityResolver(new DummyEntityResolver());
        reader.setContentHandler(handler);
        reader.setProperty(
    "http://xml.org/sax/properties/lexical-handler",
              handler);
        reader.parse(dataFileName);

----- Original Message -----
From: "Chris McCabe" <ch...@choicehotels.com>
To: <xa...@xml.apache.org>
Sent: Monday, October 22, 2001 10:43 AM
Subject: Re: How to setEntityResolver when XMLFilter is used?


> Are you sure the EntityResolver effects the reading of the external DTD?
>  I thought it only gets called for external entity declarations in the
> internal DTD, but the external DTD will still get loaded.  I could be
> wrong (especially since I just woke up).
>
> Chris
>
>
> Gary L Peskin wrote:
>
> >Do you have a stack trace from the error that occurs when the DTD file
> >cannot be found?  This might provide a clue.  I just really don't have
> >the time at the moment to try to recreate this here and think about
> >what's going wrong.  But a stack trace might provide a quick hint.
> >
> >Gary
> >
> >-----Original Message-----
> >From: Yueming Xu [mailto:yxu@vitria.com]
> >Sent: Wednesday, October 17, 2001 12:47 PM
> >To: xalan-dev@xml.apache.org
> >Subject: How to setEntityResolver when XMLFilter is used?
> >
> >
> >In the following code, I tried to use my DummyEntityResolver, so it
> >won't check for the existence of the DTD file for the incoming XML.
> >However, it does not work.  It always tries to resolve the DTD file.
> >What is wrong with this code?
> >
> >Thanks,
> >Yueming
> >
> >// Setup reusable templates
> >TransformerFactory tFactory =TransformerFactory.newInstance();
> >Templates template1 = tFactory.newTemplates(new
> >StreamSource(stylesheet1));
> >Templates template2 = tFactory.newTemplates(new
> >StreamSource(stylesheet2));
> >
> >// Set up to read the input file
> >SAXParserFactory spf = SAXParserFactory.newInstance();
> >spf.setNamespaceAware( true );
> >spf.setValidating( false );
> >SAXParser parser = spf.newSAXParser();
> >XMLReader reader = parser.getXMLReader();
> >reader.setEntityResolver(new DummyEntityResolver());
> >
> >// Set up the output stream
> >StreamResult result = new StreamResult("result.txt");
> >// Set up the input stream
> >BufferedInputStream bis =
> >new BufferedInputStream(new FileInputStream(datafile));
> >SAXTransformerFactory stf = (SAXTransformerFactory) tFactory;
> >XMLFilter filter1 = stf.newXMLFilter(template1);
> >XMLFilter filter2 = stf.newXMLFilter(template2);
> >filter1.setParent(reader);
> >filter2.setParent(filter1);
> >
> >Transformer transformer = stf.newTransformer();
> >SAXSource transformSource = new SAXSource(filter2, new
> >InputSource(bis));
> >transformer.transform(transformSource, result);
> >
>


Re: How to setEntityResolver when XMLFilter is used?

Posted by Chris McCabe <ch...@choicehotels.com>.
Are you sure the EntityResolver effects the reading of the external DTD? 
 I thought it only gets called for external entity declarations in the 
internal DTD, but the external DTD will still get loaded.  I could be 
wrong (especially since I just woke up).

Chris


Gary L Peskin wrote:

>Do you have a stack trace from the error that occurs when the DTD file
>cannot be found?  This might provide a clue.  I just really don't have
>the time at the moment to try to recreate this here and think about
>what's going wrong.  But a stack trace might provide a quick hint.
>
>Gary
>
>-----Original Message-----
>From: Yueming Xu [mailto:yxu@vitria.com] 
>Sent: Wednesday, October 17, 2001 12:47 PM
>To: xalan-dev@xml.apache.org
>Subject: How to setEntityResolver when XMLFilter is used?
>
>
>In the following code, I tried to use my DummyEntityResolver, so it
>won't check for the existence of the DTD file for the incoming XML.
>However, it does not work.  It always tries to resolve the DTD file.
>What is wrong with this code?
>
>Thanks,
>Yueming
>
>// Setup reusable templates
>TransformerFactory tFactory =TransformerFactory.newInstance();
>Templates template1 = tFactory.newTemplates(new
>StreamSource(stylesheet1));
>Templates template2 = tFactory.newTemplates(new
>StreamSource(stylesheet2));
>
>// Set up to read the input file
>SAXParserFactory spf = SAXParserFactory.newInstance();
>spf.setNamespaceAware( true );
>spf.setValidating( false );
>SAXParser parser = spf.newSAXParser();
>XMLReader reader = parser.getXMLReader();
>reader.setEntityResolver(new DummyEntityResolver());
>
>// Set up the output stream
>StreamResult result = new StreamResult("result.txt");
>// Set up the input stream
>BufferedInputStream bis = 
>new BufferedInputStream(new FileInputStream(datafile));
>SAXTransformerFactory stf = (SAXTransformerFactory) tFactory;
>XMLFilter filter1 = stf.newXMLFilter(template1);
>XMLFilter filter2 = stf.newXMLFilter(template2);
>filter1.setParent(reader);
>filter2.setParent(filter1);
>
>Transformer transformer = stf.newTransformer();
>SAXSource transformSource = new SAXSource(filter2, new
>InputSource(bis));
>transformer.transform(transformSource, result);
>



RE: How to setEntityResolver when XMLFilter is used?

Posted by Gary L Peskin <ga...@firstech.com>.
Do you have a stack trace from the error that occurs when the DTD file
cannot be found?  This might provide a clue.  I just really don't have
the time at the moment to try to recreate this here and think about
what's going wrong.  But a stack trace might provide a quick hint.

Gary

-----Original Message-----
From: Yueming Xu [mailto:yxu@vitria.com] 
Sent: Wednesday, October 17, 2001 12:47 PM
To: xalan-dev@xml.apache.org
Subject: How to setEntityResolver when XMLFilter is used?


In the following code, I tried to use my DummyEntityResolver, so it
won't check for the existence of the DTD file for the incoming XML.
However, it does not work.  It always tries to resolve the DTD file.
What is wrong with this code?

Thanks,
Yueming

// Setup reusable templates
TransformerFactory tFactory =TransformerFactory.newInstance();
Templates template1 = tFactory.newTemplates(new
StreamSource(stylesheet1));
Templates template2 = tFactory.newTemplates(new
StreamSource(stylesheet2));

// Set up to read the input file
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware( true );
spf.setValidating( false );
SAXParser parser = spf.newSAXParser();
XMLReader reader = parser.getXMLReader();
reader.setEntityResolver(new DummyEntityResolver());

// Set up the output stream
StreamResult result = new StreamResult("result.txt");
// Set up the input stream
BufferedInputStream bis = 
new BufferedInputStream(new FileInputStream(datafile));
SAXTransformerFactory stf = (SAXTransformerFactory) tFactory;
XMLFilter filter1 = stf.newXMLFilter(template1);
XMLFilter filter2 = stf.newXMLFilter(template2);
filter1.setParent(reader);
filter2.setParent(filter1);

Transformer transformer = stf.newTransformer();
SAXSource transformSource = new SAXSource(filter2, new
InputSource(bis));
transformer.transform(transformSource, result);