Re: SAX and Java 6
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