SAX and Java 6

G

Ghislain

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();
}
}
}
 
S

Stanimir Stamenkov

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
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.

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
 
S

Stanimir Stamenkov

Mon, 25 Feb 2008 19:59:11 +0200, /Stanimir Stamenkov/:
Mon, 25 Feb 2008 07:47:31 -0800 (PST), /Ghislain/:


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--
 
G

Ghislain

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
 
S

Stanimir Stamenkov

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.
 
S

Stanimir Stamenkov

Wed, 27 Feb 2008 09:51:03 +0200, /Stanimir Stamenkov/:
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

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

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,059
Latest member
cryptoseoagencies

Latest Threads

Top