Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / February 2008

Tip: Looking for answers? Try searching our database.

SAX and Java 6

Thread view: 
Ghislain - 25 Feb 2008 15:47 GMT
Hello,
 I wrote a simple java application reading xml files and therefore
used SAX. It has been working very fine for years with jdk 5. Some
users updated to java 6 and reported me errors. I checked the xml
input and it doesn't contain any error (by the way it runs fine with
java 5). Step by step I ran the reader and discovered that the with
JDK 6 the XMLreader doesn't read properly a node's attributes.
 Below, you will find my constructor.
 Thank you for your help,
Ghislain

package xml2office;
import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class Xml2Office  extends DefaultHandler {
   public Xml2Office(String[] args) {
       super();
       try {
            XMLReader xr = XMLReaderFactory.createXMLReader();
            xr.setContentHandler( this );
           xr.parse(input);
       }catch ( Exception e ) {
           System.err.println("Erreur");
           e.printStackTrace();
       }
   }
}
Stanimir Stamenkov - 25 Feb 2008 17:59 GMT
Mon, 25 Feb 2008 07:47:31 -0800 (PST), /Ghislain/:

>   I wrote a simple java application reading xml files and therefore
> used SAX. It has been working very fine for years with jdk 5. Some
[quoted text clipped - 3 lines]
> JDK 6 the XMLreader doesn't read properly a node's attributes.
>   Below, you will find my constructor.

Your example is not sufficient - I have no problem reading element's
attributes using SAX and Java 6.  What exactly doesn't get read
properly?  Give a complete test case.  You also mention "node's
attributes" - do you mean an element's attributes supplied to
'startElement' callbacks or something else?  May be you try to use
the "dom-node" [1] property?  I'm not aware of SAX implementations
supporting the "dom-node" property, nor I have ever find it suitable
use for it.

[1] http://www.saxproject.org/apidoc/org/xml/sax/package-summary.html

Signature

Stanimir

Stanimir Stamenkov - 25 Feb 2008 19:46 GMT
Mon, 25 Feb 2008 19:59:11 +0200, /Stanimir Stamenkov/:
> Mon, 25 Feb 2008 07:47:31 -0800 (PST), /Ghislain/:
>
[quoted text clipped - 3 lines]
> Your example is not sufficient - I have no problem reading element's
> attributes using SAX and Java 6.

Try the following example with any "test.xml" put into the same
package as the class:

-----Xml2Office.java
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

public class Xml2Office extends DefaultHandler {

    Xml2Office() {
        //super();
    }

    public static void main(String[] args) throws Exception {
        String uri = Xml2Office.class
                     .getResource("test.xml").toExternalForm();
        InputSource input = new InputSource(uri);
        XMLReader xr = XMLReaderFactory.createXMLReader();
        DefaultHandler handler = new Xml2Office();
        xr.setContentHandler(handler);
        xr.setErrorHandler(handler);
        xr.parse(input);
    }

    public void startElement(String uri, String localName,
                             String qname, Attributes atts) {
        for (int i = 0; i < indent; i++) {
            System.out.print("  ");
        }
        System.out.print("<" + qname);
        for (int i = 0, len = atts.getLength(); i < len; i++) {
            System.out.print(" " + atts.getQName(i) + "=\""
                             + atts.getValue(i) + "\"");
        }
        System.out.println(">");
        indent++;
    }

    public void endElement(String uri, String localName,
                           String name) {
        indent--;
    }

    private int indent;

}
-----Xml2Office.java--

Signature

Stanimir

Ghislain - 26 Feb 2008 19:36 GMT
Hello Stanimir,
 Thank you for your answer. I tried your example, it worked then
added my class' logic until the error occured. I have a private
Attributes member 'attr' which is set by startElement method that I
use later with the endElement method. I know it is not safe since
'attr' is a reference on an object which can change, but this never
happened, I lazily used it like that. Obviously changes occur and only
with java 6.
I noticed that the attributes won't mute if its methods are called in
startElement. For instance, this not will work :
package javaapplication2;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
import java.io.*;

public class Main extends DefaultHandler {

   private Attributes attr = null;

   Main() {
   //super();
   }

   public static void main(String[] args) throws Exception {
       InputSource input = new InputSource(new
FileReader("test.xml"));
       XMLReader xr = XMLReaderFactory.createXMLReader();
       DefaultHandler handler = new Main();
       xr.setContentHandler(handler);
       xr.setErrorHandler(handler);
       xr.parse(input);
   }

   public void startElement(String uri, String localName,
           String qname, Attributes atts) {
//        System.out.print("<" + qname);
//        for (int i = 0,  len = atts.getLength(); i < len; i++) {
//            System.out.print(" " + atts.getQName(i) + "=\"" +
atts.getValue(i) + "\"");
//        }
//        System.out.println(">");
       indent++;
       this.attr = atts;
   }

   public void endElement(String uri, String localName,
           String name) {
       indent--;

       if (localName.equals("re")) {
           String calcAttr = attr.getValue("v");
           int calcValue = 0;
           if (calcAttr != null) {
               // Here is the where the exception is raised,
calcAttr's value is '<' although there is NO such attribute
               calcValue = Integer.parseInt(calcAttr);
           }
           return;
       }
   }
   private int indent;
}
Ant this will work, the difference is that methods of 'atts' are
called :
package javaapplication2;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
import java.io.*;

public class Main extends DefaultHandler {

   private Attributes attr = null;

   Main() {
   //super();
   }

   public static void main(String[] args) throws Exception {
       InputSource input = new InputSource(new
FileReader("test.xml"));
       XMLReader xr = XMLReaderFactory.createXMLReader();
       DefaultHandler handler = new Main();
       xr.setContentHandler(handler);
       xr.setErrorHandler(handler);
       xr.parse(input);
   }

   public void startElement(String uri, String localName,
           String qname, Attributes atts) {
       System.out.print("<" + qname);
       for (int i = 0,  len = atts.getLength(); i < len; i++) {
           System.out.print(" " + atts.getQName(i) + "=\"" +
atts.getValue(i) + "\"");
       }
       System.out.println(">");
       indent++;
       this.attr = atts;
   }

   public void endElement(String uri, String localName,
           String name) {
       indent--;

       if (localName.equals("re")) {
           String calcAttr = attr.getValue("v");
           int calcValue = 0;
           if (calcAttr != null) {
               // Here is the where the exception is raised,
calcAttr's value is '<' although there is NO such attribute
               calcValue = Integer.parseInt(calcAttr);
           }
           return;
       }
   }
   private int indent;
}
 I recognize that I did something dangerous, but no accident happened
with java 6.
 Small question : why don't you call the superclass' constructor in
your example ?
 Thanks again Stanimir,
Ghislain
Stanimir Stamenkov - 27 Feb 2008 07:51 GMT
Tue, 26 Feb 2008 11:36:46 -0800 (PST), /Ghislain/:

>     Main() {
>     //super();
>     }
> [...]
>   Small question : why don't you call the superclass' constructor in
> your example ?

Implicit super() class is generated by the compiler.  In this regard
you know you may omit the definition of the default no-args
constructor, if it is the only one.  I have explicitly defined it so
I change its visibility, which is by default inherited from the
visibility of the defining class.

Signature

Stanimir

Stanimir Stamenkov - 27 Feb 2008 08:49 GMT
Wed, 27 Feb 2008 09:51:03 +0200, /Stanimir Stamenkov/:
> Tue, 26 Feb 2008 11:36:46 -0800 (PST), /Ghislain/:
>
[quoted text clipped - 6 lines]
>
> Implicit super() class is generated by the compiler.  In this regard you

Implicit super() call... I've meant to write.

> know you may omit the definition of the default no-args constructor, if
> it is the only one.  I have explicitly defined it so I change its
> visibility, which is by default inherited from the visibility of the
> defining class.

Signature

Stanimir



Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.