You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-users@xerces.apache.org by "Roger L. Costello" <co...@mitre.org> on 2002/10/10 18:59:29 UTC

Can't get Andy Clark's sample Entity Resolver to work

Hi Folks,

I recently purchased a book [1] in which Andy Clark has a section on
using an Entity Resolver to override the System ID in a DOCTYPE
declaration.  I have had problems getting his code to work.

Here is the Entity Resolver that I copied from Andy's book:

public class SimpleEntityResolver
    implements EntityResolver {

    public InputSource resolveEntity(String publicId, String systemId)
        throws SAXException, IOException {
        System.out.println("systemId = " + systemId);        
        // resolve known entity using system identifier
        if (systemId.equals("http://www.xfront.com/BookCatalogue.dtd"))
{
            // open local file
            InputStream inputStream = 
                     new FileInputStream("c:\\BookCatalogue.dtd");    
    
            // create input source and return
            InputSource inputSource = new InputSource(inputStream);
            inputSource.setPublicId(publicId);
            inputSource.setSystemId(systemId);
            return inputSource;
        }
        
        // don't know how to resolve entity, let parser resolve it
        return null;
    
    }

Notice the output statement that I inserted, to output the value of the
systemId parameter.  It always outputs a value of null (why?)  Here is
the XML document that I can using:

<?xml version="1.0"?>
<!DOCTYPE BookCatalogue SYSTEM
"http://www.xfront.com/BookCatalogue.dtd">
<BookCatalogue>
        <Book>
                <Title>My Life and Times</Title>
                <Author>Paul McCartney</Author>
                <ISBN>94303-12021-43892</ISBN>
                <Publisher>McMillin Publishing</Publisher>
                <Date>July, 1998</Date>
        </Book> 
        ...
</BookCatalogue>

Oddly, when I modified the Entity Resolver to not do the if-test on the
systemId, then it worked fine.  That is, here is the modified Entity
Resolver:

public class SimpleEntityResolver
    implements EntityResolver {

    public InputSource resolveEntity(String publicId, String systemId)
        throws SAXException, IOException {
            // open local file
            InputStream inputStream = 
                     new FileInputStream("c:\\BookCatalogue.dtd");    
    
            // create input source and return
            InputSource inputSource = new InputSource(inputStream);
            inputSource.setPublicId(publicId);
            inputSource.setSystemId(systemId);
            return inputSource;
    }

This version works fine.  Can someone tell me why the systemId is always
null when this method is fired?

For completeness, here is the SAX parser code that I am using:

    public static String process(String xmlFileURL) {
        try {
            validate validate = new validate();
            XMLReader parser = 
                XMLReaderFactory.createXMLReader(parserName);
            EntityResolver entityResolver = new SimpleEntityResolver();
            parser.setEntityResolver(entityResolver);
            parser.setContentHandler(validate);
            parser.setErrorHandler(validate);
            parser.setFeature("http://xml.org/sax/features/validation",
true);
            parser.parse(xmlFileURL);
            return validate.result.toString(); 
        }
        catch (Exception e) { e.printStackTrace(); }
        return null;

Any help would be much appreciated.  /Roger

[1] XML and Java, Second Edition, Developing Web Applications


---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-j-user-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-j-user-help@xml.apache.org


Re: Can't get the sample socket example to work (KeepSocketOpen)

Posted by Andy Clark <an...@apache.org>.
Roger L. Costello wrote:
> Note: changing the port number in KeepSocketOpen.java made no
> difference.

Hmmm... How is your machine configured? You should
have some ports open. You may want to change the
code in the sample to add a loop that tries to
create the server with different port numbers and
then create the client with the port number that
actually succeeded.

-- 
Andy Clark * andyc@apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-j-user-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-j-user-help@xml.apache.org


Can't get the sample socket example to work (KeepSocketOpen)

Posted by "Roger L. Costello" <co...@mitre.org>.
Hi Folks,

In the xerces-2_2_0 samples subfolder is a "socket" example.  I am
unable to get it to run.  I get an "Address in Use" exception.  Below is
the full error message.  Any ideas on what the problem is and how to
resolve it?  /Roger

Here is the error message:

Exception in thread "main" java.net.BindException: Address in use:
JVM_Bind
        at java.net.PlainSocketImpl.socketBind(Native Method)
        at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:405)
        at java.net.ServerSocket.<init>(ServerSocket.java:170)
        at java.net.ServerSocket.<init>(ServerSocket.java:82)
        at socket.KeepSocketOpen$Server.<init>(Unknown Source)
        at socket.KeepSocketOpen$Server.<init>(Unknown Source)
        at socket.KeepSocketOpen.main(Unknown Source)

Note: changing the port number in KeepSocketOpen.java made no
difference.


---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-j-user-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-j-user-help@xml.apache.org


Re: Can't get Andy Clark's sample Entity Resolver to work

Posted by Simon Kitching <si...@ecnetwork.co.nz>.
This is a known bug in Xerces, long since fixed. You need to upgrade to
a recent version of Xerces.

Searching bugzilla for "EntityResolver" will display the relevant
item(s).

Regards

Simon

On Fri, 2002-10-11 at 05:59, Roger L. Costello wrote:
> Hi Folks,
> 
> I recently purchased a book [1] in which Andy Clark has a section on
> using an Entity Resolver to override the System ID in a DOCTYPE
> declaration.  I have had problems getting his code to work.
> 
> Here is the Entity Resolver that I copied from Andy's book:
> 
> public class SimpleEntityResolver
>     implements EntityResolver {
> 
>     public InputSource resolveEntity(String publicId, String systemId)
>         throws SAXException, IOException {
>         System.out.println("systemId = " + systemId);        
>         // resolve known entity using system identifier
>         if (systemId.equals("http://www.xfront.com/BookCatalogue.dtd"))
> {
>             // open local file
>             InputStream inputStream = 
>                      new FileInputStream("c:\\BookCatalogue.dtd");    
>     
>             // create input source and return
>             InputSource inputSource = new InputSource(inputStream);
>             inputSource.setPublicId(publicId);
>             inputSource.setSystemId(systemId);
>             return inputSource;
>         }
>         
>         // don't know how to resolve entity, let parser resolve it
>         return null;
>     
>     }
> 
> Notice the output statement that I inserted, to output the value of the
> systemId parameter.  It always outputs a value of null (why?)  Here is
> the XML document that I can using:
> 
> <?xml version="1.0"?>
> <!DOCTYPE BookCatalogue SYSTEM
> "http://www.xfront.com/BookCatalogue.dtd">
> <BookCatalogue>
>         <Book>
>                 <Title>My Life and Times</Title>
>                 <Author>Paul McCartney</Author>
>                 <ISBN>94303-12021-43892</ISBN>
>                 <Publisher>McMillin Publishing</Publisher>
>                 <Date>July, 1998</Date>
>         </Book> 
>         ...
> </BookCatalogue>
> 
> Oddly, when I modified the Entity Resolver to not do the if-test on the
> systemId, then it worked fine.  That is, here is the modified Entity
> Resolver:
> 
> public class SimpleEntityResolver
>     implements EntityResolver {
> 
>     public InputSource resolveEntity(String publicId, String systemId)
>         throws SAXException, IOException {
>             // open local file
>             InputStream inputStream = 
>                      new FileInputStream("c:\\BookCatalogue.dtd");    
>     
>             // create input source and return
>             InputSource inputSource = new InputSource(inputStream);
>             inputSource.setPublicId(publicId);
>             inputSource.setSystemId(systemId);
>             return inputSource;
>     }
> 
> This version works fine.  Can someone tell me why the systemId is always
> null when this method is fired?
> 
> For completeness, here is the SAX parser code that I am using:
> 
>     public static String process(String xmlFileURL) {
>         try {
>             validate validate = new validate();
>             XMLReader parser = 
>                 XMLReaderFactory.createXMLReader(parserName);
>             EntityResolver entityResolver = new SimpleEntityResolver();
>             parser.setEntityResolver(entityResolver);
>             parser.setContentHandler(validate);
>             parser.setErrorHandler(validate);
>             parser.setFeature("http://xml.org/sax/features/validation",
> true);
>             parser.parse(xmlFileURL);
>             return validate.result.toString(); 
>         }
>         catch (Exception e) { e.printStackTrace(); }
>         return null;
> 
> Any help would be much appreciated.  /Roger
> 
> [1] XML and Java, Second Edition, Developing Web Applications
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: xerces-j-user-unsubscribe@xml.apache.org
> For additional commands, e-mail: xerces-j-user-help@xml.apache.org
> 
> 



---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-j-user-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-j-user-help@xml.apache.org