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