# Speicherüberlauf bei character-Methode mit SAX-Parser



## Dj-Smu (1. Mrz 2008)

Hallo Community,

ich programmiere gerade einen chinesisch Vokabeltrainer der die Vokabeln aus einer XML-Datei ausliest und in ein JTable speichert. Das funkioniert sehr gut, nur jedes 50. Wort ist abgeschnitten und ich sehe nur den 2. Teil. Den Fehler konnte ich in der character callback ausmachen:


```
public void characters(char[] ch, int start, int length) throws SAXException {
            tempVal = new String(ch,start,length);
            System.out.println("tempVal: "+tempVal+" Start: "+start);
	}
```

Wenn ich mir die Startwerte in der Konsole ausgeben lasse, dann sehe ich, dass start von 0 bis etwa 2000 gezählt wird und danach wieder bei 0 anfängt. Genau die Wörter die bei 2000 ankommen, haben einen Zeilenumbruch und werden abgeschnitten. Ich weiß nicht genau wieso da bis 2000 gezählt wird, noch was ich dagegen machen kann.


Zur Vollständigkeit der komplette Code:


```
public void loadDocument(String filepath_){
		//get a factory
                allWords = new Vector<Word>();
		SAXParserFactory spf = SAXParserFactory.newInstance();
		try {
		
			//get a new instance of parser
			SAXParser sp = spf.newSAXParser();
			
			//parse the file and also register this class for call backs
			sp.parse(filepath_, this);
			
		}catch(SAXException se) {
			se.printStackTrace();
		}catch(ParserConfigurationException pce) {
			pce.printStackTrace();
		}catch (IOException ie) {
			ie.printStackTrace();
		}
    }

	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		tempVal = "";
		if(qName.equalsIgnoreCase("Word")) {
			tempWord = new Word();
		}
	}
	

	public void characters(char[] ch, int start, int length) throws SAXException {
            tempVal = new String(ch,start,length);
            System.out.println("tempVal: "+tempVal+" Start: "+start);
	}
	
	public void endElement(String uri, String localName, String qName) throws SAXException {

		if(qName.equalsIgnoreCase("Word")) {
			//add it to the list
			allWords.add(tempWord);
			
		}else if (qName.equalsIgnoreCase("Translation")) {
			tempWord.setTranslation(tempVal);
		}else if (qName.equalsIgnoreCase("Pinyin")) {
			tempWord.setPinyin(tempVal);
		}else if (qName.equalsIgnoreCase("Character")) {
			tempWord.setCharacter(tempVal);
		}else if (qName.equalsIgnoreCase("Knowledge")) {
			tempWord.setKnowledge(tempVal);
		}
		
	}
```


Die XML-Datei ist folgendermaßen aufgebaut:


```
<?xml version="1.0" encoding="UTF-8"?>
<Vocabulary>
    <Word>
        <Translation>ausruhen</Translation>
        <Pinyin>xiu1</Pinyin>
        <Character>休</Character>
        <Knowledge>95</Knowledge>
    </Word>
    <Word>
        <Translation>ich</Translation>
        <Pinyin>wo3</Pinyin>
        <Character>我</Character>
        <Knowledge>80</Knowledge>
    </Word>
    <Word>
        <Translation>Ozean</Translation>
        <Pinyin>yang2</Pinyin>
        <Character>洋</Character>
        <Knowledge>85</Knowledge>
    </Word>
</Vocabulary>
```


----------



## Murray (1. Mrz 2008)

Man darf nicht damit rechnen, dass zusammenhängende Zeichenketten der XML-Datei immer zu einem einzigen Aufruf der characters-Methode führen.

Vielleicht hilft dieser Artikel weiter.


----------



## Gelöschtes Mitglied 5909 (2. Mrz 2008)

ich würde dir statt sax entweder dom oder stax empfehlen,
wobei dom bei größeren XML files zu viel speicher frist da alle elemente im speicher gehalten werden. stax is aber auch wunderbar einfach, frist keinen speicher und wie ich finde einiges angenehmer als sax. 

Wenn du aber bereits alles implementiert hast bleibt dir nix anderes übrig wie des zu machen was in dem artikel von murray steht


----------



## Dj-Smu (2. Mrz 2008)

Dank für den Tipp raiL, ich werde mich in Zukunft mal genauer mit Stax beschäftigen.

Der Artikel von Murray hat den Nagel auf den Kopf getroffen. War kein großer Aufwand, dass über einen StringBuffer einzulesen, und jetzt läuft alles fehlerfrei!

Vielen Dank für die Hilfe!  :applaus:


----------

