# Problem mit SAX-Parser characters()



## Remo (18. Okt 2005)

hi...ich habe das PRoblem das die Methode characters() vom SAX-Parser nicht bei jedem XML aufgerufen wird.
Hier mein Code:


```
package ch.swisslife.prov.bp.ejbtestclient.service;

import java.io.FileReader;

import javax.xml.parsers.SAXParser;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

public class TestReaderHandler extends DefaultHandler {

	public static void main(String args[]) throws Exception {
		args = new String[1];
		args[0] = "test.xml";
		
		XMLReader xr = new org.apache.xerces.parsers.SAXParser();
		TestReaderHandler handler = new TestReaderHandler();
		xr.setContentHandler(handler);
		xr.setErrorHandler(handler);

		// Parse each file provided on the
		// command line.
		for (int i = 0; i < args.length; i++) {
			FileReader r = new FileReader(args[i]);
			xr.parse(new InputSource(r));
		}
	}

	public TestReaderHandler() {
		super();
	}

	////////////////////////////////////////////////////////////////////
	// Event handlers.
	////////////////////////////////////////////////////////////////////

	public void startDocument() {
		System.out.println("Start document");
	}

	public void endDocument() {
		System.out.println("End document");
	}

	public void startElement(String uri, String name, String qName,
			Attributes atts) {
		if ("".equals(uri))
			System.out.println("Start element: " + qName);
		else
			System.out.println("Start element: {" + uri + "}" + name);
	}

	public void endElement(String uri, String name, String qName) {
		if ("".equals(uri))
			System.out.println("End element: " + qName);
		else
			System.out.println("End element:   {" + uri + "}" + name);
	}

	public void characters(char ch[], int start, int length) {
		System.out.print("Characters:    \"");
		for (int i = start; i < start + length; i++) {

			switch (ch[i]) {
			case '\\':
				System.out.print("\\\\");
				break;
			case '"':
				System.out.print("\\\"");
				break;
			case '\n':
				System.out.print("\\n");
				break;
			case '\r':
				System.out.print("\\r");
				break;
			case '\t':
				System.out.print("\\t");
				break;
			default:
				System.out.print(ch[i]);
				break;
			}
		}
		System.out.print("\"\n");
	}

}
```


Bei diesem XML (richtig mit test.dtd validiert) funktioniert die Ausgabe wunschgemäss:

```
<?xml version="1.0"?>
<!DOCTYPE poem SYSTEM "Z:\PROV\EJBTestClient\test.dtd">
<poem xmlns="http://www.megginson.com/ns/exp/poetry">
	<title>Roses are Red</title>
	<l>Roses are red,</l>
	<l>Violets are blue;</l>
	<l>Sugar is sweet,</l>
	<l>And I love you.</l>
</poem>
```

Bei diesem XML (richtig mit methods.dtd validiert) jedoch nicht:

```
<?xml version="1.0"?>
<!DOCTYPE Methodenfile SYSTEM "Z:\PROV\EJBTestClient\methods.dtd">
<Methodenfile name="methoden">
	<Methode name="hasProvisionsabrechnung" returntyp="java.lang.Boolean">
		<Parameter name="GPNR" datentyp="java.lang.Integer"/>
		<Parameter name="Monat" datentyp="java.lang.Integer"/>
		<Parameter name="Jahr" datentyp="java.lang.Integer"/>
	</Methode>
	<Methode name="getProvisionsabrechnung" returntyp="ch.swisslife.util.MimeDocument">
		<Parameter name="GPNR" datentyp="java.lang.Integer"/>
		<Parameter name="Monat" datentyp="java.lang.Integer"/>
		<Parameter name="Jahr" datentyp="java.lang.Integer"/>
	</Methode>
	<Methode name="getEVVertrag" returntyp="ch.swisslife.prov.bp.bom.PROVEVVertrag">
		<Parameter name="VertragNR" datentyp="java.lang.String"/>
		<Parameter name="Sprache" datentyp="java.lang.String"/>
		<Parameter name="GPNR" datentyp="java.lang.Integer"/>
	</Methode>
	<Methode name="getEinmaligeProvisionenZuEVVertrag" returntyp="java.util.List">
		<Parameter name="VertragNR" datentyp="java.lang.String"/>
		<Parameter name="Sprache" datentyp="java.lang.String"/>
		<Parameter name="GPNR" datentyp="java.lang.Integer"/>
	</Methode>
	<Methode name="getPROVEVKontoZuBrokerFirma" returntyp="java.util.List">
		<Parameter name="Monat" datentyp="java.lang.Integer"/>
		<Parameter name="Jahr" datentyp="java.lang.Integer"/>
		<Parameter name="Sprache" datentyp="java.lang.String "/>
		<Parameter name="GPNR" datentyp="java.lang.Integer"/>
	</Methode>
</Methodenfile>
```

Beim zweiten XML geht er nie in die characters Methode. Beim ersten schon
Was mache ich falsch?

Gruss Remo


----------



## Mag1c (18. Okt 2005)

Hi,

nix. Ist korrekt so. Schon mal in die Attributes bei startElement(...) geschaut ?

Gruß
Mag1c


----------



## Remo (18. Okt 2005)

beim ersten XML File sieht die Ausgabe so aus:

```
Start document
Start element: {http://www.megginson.com/ns/exp/poetry}poem
Start element: {http://www.megginson.com/ns/exp/poetry}title
Characters:    "Roses are Red"
End element:   {http://www.megginson.com/ns/exp/poetry}title
Start element: {http://www.megginson.com/ns/exp/poetry}l
Characters:    "Roses are red,"
End element:   {http://www.megginson.com/ns/exp/poetry}l
Start element: {http://www.megginson.com/ns/exp/poetry}l
Characters:    "Violets are blue;"
End element:   {http://www.megginson.com/ns/exp/poetry}l
Start element: {http://www.megginson.com/ns/exp/poetry}l
Characters:    "Sugar is sweet,"
End element:   {http://www.megginson.com/ns/exp/poetry}l
Start element: {http://www.megginson.com/ns/exp/poetry}l
Characters:    "And I love you."
End element:   {http://www.megginson.com/ns/exp/poetry}l
End element:   {http://www.megginson.com/ns/exp/poetry}poem
End document
```

Beim zweiten (welches nicht richtig funktioniert)

```
Start document
Start element: Methodenfile
Start element: Methode
Start element: Parameter
End element: Parameter
Start element: Parameter
End element: Parameter
Start element: Parameter
End element: Parameter
End element: Methode
Start element: Methode
Start element: Parameter
End element: Parameter
Start element: Parameter
End element: Parameter
Start element: Parameter
End element: Parameter
End element: Methode
Start element: Methode
Start element: Parameter
End element: Parameter
Start element: Parameter
End element: Parameter
Start element: Parameter
End element: Parameter
End element: Methode
Start element: Methode
Start element: Parameter
End element: Parameter
Start element: Parameter
End element: Parameter
Start element: Parameter
End element: Parameter
End element: Methode
Start element: Methode
Start element: Parameter
End element: Parameter
Start element: Parameter
End element: Parameter
Start element: Parameter
End element: Parameter
Start element: Parameter
End element: Parameter
End element: Methode
End element: Methodenfile
End document
```

Wie man sieht werden beim ersten die System.out's in der Methode characters ausgegeben, beim zweiten jedoch nicht


----------



## Remo (18. Okt 2005)

wie meinste das? was müsste in den Attributs sein?


----------



## Mag1c (18. Okt 2005)

Schau doch einfach mal nach  :


```
for (int i=0; i < atts.getLength(); i++) {
    System.out.println("QName: "+atts.getQName(i));
    System.out.println("Value: "+atts.getValue(i));
}
```

Gruß
Mag1c


----------



## Remo (18. Okt 2005)

Wenn ich das erste XML-File verwende ist Attribute leer

beim zweiten hat es folgende Werte:

```
QName: name
Value: methoden
Start element: Methodenfile
QName: name
Value: hasProvisionsabrechnung
QName: returntyp
Value: java.lang.Boolean
Start element: Methode
QName: name
Value: GPNR
QName: datentyp
Value: java.lang.Integer
...

etc....
```

hmm...warum steht beim ersten nichts drin?


----------



## Mag1c (18. Okt 2005)

weil

<tag>value</tag>

was anderes ist als

<tag attrib="value"></tag>

bzw. dessen Kurzform

<tag attrib ="value"/>

Lies mal eine Einführung/Tutorial zu XML.

Gruß
Mag1c


----------



## Remo (18. Okt 2005)

okay 

Danke für die Hilfe

Gruss Remo


----------

