SAX Handler Sonderzeichen

T

Tobias Köhler

Hallo
Ich habe mir vorgenommen, einen News-Service oder ähnliches zu schreiben und stehe nun vor dem Problem, dass ich die xml-Datei von spiegel.de parsen muss. Dabei geschieht es aber, dass ein Zeilenumbruch eingefügt wird, sobald ein Sonderzeichen in der Zeichenkette vorhanden ist. Ich zeige mal besser einen Auszug des vorhandenen Codes;)

Aufruf in dem Programm:
Java:
SAXParserFactory factory = SAXParserFactory.newInstance();
try 
    {
	DefaultHandler handler = new Handler();
	SAXParser saxParser = factory.newSAXParser();
	saxParser.parse("http://www.spiegel.de/schlagzeilen/rss/0,5291,,00.xml", handler);
    } 
catch (ParserConfigurationException e) 
{e.printStackTrace();} 
catch (SAXException e) 
{e.printStackTrace();}
catch(IOException e)
{e.printStackTrace();

Meine Klasse Handler erbt von DefaultHandler und überschreibt die Methoden hiermit:
Java:
///////////////////////////////////////////////////////////////////////////////////
//		@author: Tobias Köhler
//		@date: 10-01-2007
//		@most recent amendment: 10-01-2007
//----------------------------------------------------------------------------
//	implements the searchcriteria for the handler
///////////////////////////////////////////////////////////////////////////////////

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;


public class Handler extends DefaultHandler
{
	public void startDocument() throws SAXException
	{
	    System.out.println( "Start des Dokuments" );
	}
	
	public void startElement( String namespaceURI, String localName,
			  String qName, Attributes atts ) throws SAXException
	{
	    System.out.println( "Start eines Elements" );
	    System.out.println( "namespaceURI: " + namespaceURI );
		System.out.println( "localName: " + localName );
		System.out.println( "qName: " + qName );

		 for ( int i = 0; i < atts.getLength(); i++ )
		                  System.out.println( "Attribut Nr. " + i + ": " +
			          atts.getQName( i ) + " = " + atts.getValue( i ) );
	}
	
	public void characters( char ch[], int start, int length )
	{
	    System.out.println( "Start von characters" );
	    System.out.println( "Zeichenkette: " );

	    for ( int i = start; i < (start + length); i++ )
	      System.out.print( "" + ch[i] );

	    System.out.println();
	}
	
	public void endElement( String namespaceURI, String localName, String qName )
	{
	    System.out.println( "Ende eines Elements" );
	    System.out.println( "namespaceURI: " + namespaceURI );
	    System.out.println( "localName: " + localName );
	    System.out.println( "qName: " + qName );
	}
	
	public void endDocument()
	{
	    System.out.println( "Ende des Dokuments" );
	}
}

Und die Ausgabe ist dann diese

Code:
Start des Dokuments
Start eines Elements
namespaceURI: 
localName: 
qName: rss
Attribut Nr. 0: version = 0.91
Start von characters
...........
Start eines Elements
namespaceURI: 
localName: 
qName: title
Start von characters
Zeichenkette: 
Concorde-Auktion:  26.000 Euro f
Start von characters
Zeichenkette: 
ü
Start von characters
Zeichenkette: 
r Machmesser
Ende eines Elements
 
Hallo,

du brauchst nicht jedes Zeichen einzeln auszugeben.

Du könntest es so machen
Code:
String text = new String(ch, start, length);
text = text.trim();

So können nur auch Leerzeichen abgeschnitten sein. Das hatte ich aber auch auf diese art gelöst, weiß nur nicht mehr ganz wie.

MFG

zEriX
 
Stimmt, so geht es auch. Die Leerzeichen bleiben bei mir erhalten, dafür aber immer noch das Problem mit den Sonderzeichen. Ob mir da regex weiterhelfen könnte?;)
 
Vielleicht kommt die neue Zeile auch, weil du ein System.out.println machst und damit in die nächste Zeile springst. Die Methode characters kann öfter als einmal aufgerufen, werden. Wenn du dir deine Ausgabe anschaust, siehst du das auch.

MFG

zEriX
 
Ja, das sieht man ja;) Aber letztendlich soll das Ziel sein, dass, wenn die characters nicht mit http anfangen, soll in einem Tree ein neues Item kommen, wenn sie aber mit http anfangen, sollen Listener erzeugt werden, die in einem Browser die News laden. Also bräuchte ich den Inhalt von einem title schon gesamt in einer Variablen. print und println sollte nur ein Test sein;)
 
Du siehst doch wenn ein Element anfängt und wenn es fertig ist. Warum machst du dir nicht einfach einen StringBuffer und baust dir den kompletten String zusammen bis das Element fertig ist. Dann hast du den kompletten String ohne Leerzeilen.

MFG

zEriX
 
Zurück