R
Rusti
Gast
Hallo Gemeinde,
ich habe ein Problem beim Parsen von XML Dokumenten mittels des SAXParsers. Ich nutze den Parser zunächst mit einem allgemeinen Handler, welcher anhand des ersten erkannten Objektes einen speziellen Handler aufruft:
Methode zum Parsen:
Der allgemeine Handler:
Die speziellen Handler machen nicht aufregendes, sie sortieren die Gefundenen Elemente bzw. deren Inhalt mittels startElement() und characters() in die entsprechenden Datenstrukturen. Alles funktioniert wunderbar mit kleinen Dateien (<8kb).
Bei Dateien, welche die Kapazität des char[]-Arrays allerdings überschreiten wird es problematisch.
Wenn ich während des Parse-Vorgangs den Content Handler wechsle, wird nach Beendigung des aktuellen "char[]" Arrays kein neues mehr angefangen und der Vorgang bricht mit "XML document structures must start and end within the same entity." ab... Habe die Sache inzwischen soweit eingegrenzt, dass die Datei nach 8192Byte schlicht nicht weiter eingelesen wird.
Wenn ich diesen Hanlderwechsel nicht durchführe läuft der Parser ohne murren durch und beginnt ohne Weiteres die nächsten 8192 Byte.
Ich finde zu der Thematik leider nicht einmal Anhaltspunkte im Netz.
Kennt sich hier evtl. jemand mit der Geschichte aus und hat ein paar Hinzweise für mich?
Beste Grüße
Rusti
ich habe ein Problem beim Parsen von XML Dokumenten mittels des SAXParsers. Ich nutze den Parser zunächst mit einem allgemeinen Handler, welcher anhand des ersten erkannten Objektes einen speziellen Handler aufruft:
Methode zum Parsen:
Java:
public static Object parseXML(byte[] b) {
ByteArrayInputStream bs = new ByteArrayInputStream(b);
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
XML_Handler handler = new XML_Handler(parser, bs);
parser.parse(bs, handler);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
System.out.println("Fehler beim Parsen des Dokuments!");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return parsing_result;
}
Der allgemeine Handler:
Java:
public class XML_Handler extends DefaultHandler{
public SAXParser parser;
public ByteArrayInputStream bais;
public XML_Handler(SAXParser psr, ByteArrayInputStream bs) {
this.parser = psr;
this.bais = bs;
}
@Override
public void startDocument() throws SAXException {
System.out.println("New Document started...");
}
/**
* Bei Erkennung eines Dokuments wird ein spezialisierter Handler an den Parser übergeben.
*/
@Override
public void startElement(String uri, String localName,
String qName, Attributes atts) throws SAXException {
System.out.format("%s found!\n",qName);
try {
if ( qName.equals("Resolution_Data") ) {
this.parser.getXMLReader().setContentHandler(new ResData_Handler());
}
else if ( qName.equals("Scheduling_Data") ) {
this.parser.getXMLReader().setContentHandler(new
SchedData_Handler());
}
...............
else {
System.out.format("Kein Parser für den Dokumenttyp %s gefunden!",qName);
this.parser.getXMLReader().setContentHandler(null);
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Die speziellen Handler machen nicht aufregendes, sie sortieren die Gefundenen Elemente bzw. deren Inhalt mittels startElement() und characters() in die entsprechenden Datenstrukturen. Alles funktioniert wunderbar mit kleinen Dateien (<8kb).
Bei Dateien, welche die Kapazität des char[]-Arrays allerdings überschreiten wird es problematisch.
Wenn ich während des Parse-Vorgangs den Content Handler wechsle, wird nach Beendigung des aktuellen "char[]" Arrays kein neues mehr angefangen und der Vorgang bricht mit "XML document structures must start and end within the same entity." ab... Habe die Sache inzwischen soweit eingegrenzt, dass die Datei nach 8192Byte schlicht nicht weiter eingelesen wird.
Wenn ich diesen Hanlderwechsel nicht durchführe läuft der Parser ohne murren durch und beginnt ohne Weiteres die nächsten 8192 Byte.
Ich finde zu der Thematik leider nicht einmal Anhaltspunkte im Netz.
Kennt sich hier evtl. jemand mit der Geschichte aus und hat ein paar Hinzweise für mich?
Beste Grüße
Rusti
Zuletzt bearbeitet von einem Moderator: