Die Handler haben alle eine identische Form, der der zum Absturz führt ist der folgende:
[code=Java]
package handlers;
import java.util.ArrayList;
import java.util.List;
import model.XML_Parser;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import sections.DBTSection;
import structures.Descriptor;
import structures.Scheduling_Information;
import structures.Table;
import structures.Descriptor.Descriptor_Content;
import structures.Scheduling_Information.Content_Provider;
import structures.Scheduling_Information.Programme;
public class Scheduling_Information_Handler extends DefaultHandler {
public Scheduling_Information schi;
public int cumlength;
public int num_sections;
public int listlength;
public int bitcounter;
public int dsc_length;
public Table dbt;
/**
* Eine Liste, welchen den Pfad des aktuellen Objektes enthält, z.B.
* { program_map_table, pmt_section, elementary_stream, es_descriptor, descriptor_tag }
*/
public List<String> current_object;
public Scheduling_Information_Handler () {
this.schi = new Scheduling_Information();
this.dbt = new Table("DBT",68,1);
this.current_object = new ArrayList<String>();
current_object.add("scheduling_information");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
current_object.add(qName);
if ( qName.equals("content_provider") ) {
schi.content_providers.add(schi.new Content_Provider());
}
else if ( qName.equals("programme") ) {
Content_Provider actprv = schi.content_providers.get(schi.content_providers.size()-1);
actprv.programmes.add(schi.new Programme());
}
............................. Hier kommen noch einige, die immer tiefer verschachtelte Strukturen aufbauen.....................................
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
current_object.remove(current_object.size()-1);
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if ( ch[start] == '\n' ) return;
String curobj = current_object.get(current_object.size()-1);
String prvobj = current_object.get(current_object.size()-2);
StringBuilder result = new StringBuilder();
for (int i=start; i < (start + length); i++) result.append(ch[i]);
Content_Provider actprv = schi.content_providers.get(schi.content_providers.size()-1);
if ( curobj.equals("event_component_id") ) {
Programme actpro = actprv.programmes.get(actprv.programmes.size()-1);
Scheduling_Information.Event actevt = actpro.events.get(actpro.events.size()-1);
Scheduling_Information.Event_Component actcmp = actevt.event_components.get(actevt.event_components.size()-1);
actcmp.event_component_id = Integer.parseInt(result.toString());
}
else if ( curobj.equals("dbt_id") ) {
actprv.dbt_id = Integer.parseInt(result.toString());
}
.................................. hier werden dann die Inhalte der Elemente in die oben erzeugte Datenstruktur eingelesen.................................................
@Override
public void endDocument() throws SAXException {
.............. Hier erfolgt das setzen von Werten in der aufgebauten Datenstruktur, z.b. Bestimmung der Länge der erzeugten Substrukturen.............................
}
[/code]
Die endDocument() habe ich mal rausgeschnitten, da kommt der Parser aber auch definitiv nicht mehr an. Ich habe mich soweit rangetastet, dass der Abbruch beim Erreichen des Endes des char[] Arrays auftritt. Normalerweise liest des Parser ja zum Ende hin einfach den nächsten Teil der Quelldatei ein. Nach einem Wechsel des Handlers ist aber wie gesagt Schluss wenn er das Ende erreicht. Schonmal vielen Dank fürs angucken!
Rusti