Problem mit SAX-Parser characters()

  • Themenstarter Themenstarter Remo
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
R

Remo

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

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:
Code:
<?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:
Code:
<?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
 
Hi,

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

Gruß
Mag1c
 
beim ersten XML File sieht die Ausgabe so aus:
Code:
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)
Code:
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
 
Schau doch einfach mal nach 😉 :

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

Gruß
Mag1c
 
Wenn ich das erste XML-File verwende ist Attribute leer

beim zweiten hat es folgende Werte:
Code:
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?
 
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
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben