Hallo,
ich möchte eine (etwas eigenwillige) XHTML Datei parsen, um Informationen bestimmter Tags auszulesen. Das Problem ist, dass offenbar irgendwo in Datei ein fehlerhaftes Zeichen zu sein scheint, so dass ich immer eine Exception bekomme, während der Parser die Wohlgeformtheit prüft:
Die XHTML Datei ist sehr dämlich aufgebaut (700kb groß, keine Formatierung, ewig lange Zeilen), so dass es mir unmöglich erscheint, die Fehlerquelle zu Fuß zu finden. Ich bin mir auch nicht sicher, ob es vielleicht nicht einfach nur ein Kodierungsproblem ist, also Java die korrekte Kodierung der Datei nicht feststellen kann.
Gibt es eine Möglichkeit, mit SAX zu parsen und solche Fehler einfach zu ignorieren? Denn mir ist das Format ansich ziemlich wurscht, ich möchte einfach nur alle <span> Elemente auslesen. Dazu hab ich mir einen DefaultHandler geschrieben, um genau diese Elemente zu behandeln. Nur soweit komme ich halt gar nicht, weil vorher schon die Exception kommt.
Gibt es eine Möglichkeit, die Prüfung auf wohlgeformtheit zu deaktivieren und trotzdem ein Dokument mit SAX zu parsen? Oder kennt jemand eine andere Möglichkeit, um Elemente aufzulesen? Ich habe auch schon versucht, einen eigenen Parser zu schreiben. Das Problem dabei ist jedoch, dass man die Datei nicht mal zeilenweise mit nem Reader einlesen kann, weil die Zeilen so lang sind, dass die Performance dabei in die Knie geht.
Der Code sieht im Moment wie folgt aus:
ich möchte eine (etwas eigenwillige) XHTML Datei parsen, um Informationen bestimmter Tags auszulesen. Das Problem ist, dass offenbar irgendwo in Datei ein fehlerhaftes Zeichen zu sein scheint, so dass ich immer eine Exception bekomme, während der Parser die Wohlgeformtheit prüft:
Code:
org.xml.sax.SAXParseException: Der Inhalt ab "<
" ist unzulässiges Markup. Möglicherweise muss das Zeichen "
" ( ) ein Buchstabe sein.
at org.apache.crimson.parser.Parser2.fatal(Unknown Source)
at org.apache.crimson.parser.Parser2.fatal(Unknown Source)
at org.apache.crimson.parser.Parser2.content(Unknown Source)
at org.apache.crimson.parser.Parser2.maybeElement(Unknown Source)
at org.apache.crimson.parser.Parser2.content(Unknown Source)
at org.apache.crimson.parser.Parser2.maybeElement(Unknown Source)
at org.apache.crimson.parser.Parser2.content(Unknown Source)
at org.apache.crimson.parser.Parser2.maybeElement(Unknown Source)
at org.apache.crimson.parser.Parser2.content(Unknown Source)
at org.apache.crimson.parser.Parser2.maybeElement(Unknown Source)
at org.apache.crimson.parser.Parser2.content(Unknown Source)
at org.apache.crimson.parser.Parser2.maybeElement(Unknown Source)
at org.apache.crimson.parser.Parser2.parseInternal(Unknown Source)
at org.apache.crimson.parser.Parser2.parse(Unknown Source)
at org.apache.crimson.parser.XMLReaderImpl.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at de.tubs.xhtml.SpanParser.parse(SpanParser.java:34)
at de.tubs.xhtml.SpanParser.main(SpanParser.java:51)
Die XHTML Datei ist sehr dämlich aufgebaut (700kb groß, keine Formatierung, ewig lange Zeilen), so dass es mir unmöglich erscheint, die Fehlerquelle zu Fuß zu finden. Ich bin mir auch nicht sicher, ob es vielleicht nicht einfach nur ein Kodierungsproblem ist, also Java die korrekte Kodierung der Datei nicht feststellen kann.
Gibt es eine Möglichkeit, mit SAX zu parsen und solche Fehler einfach zu ignorieren? Denn mir ist das Format ansich ziemlich wurscht, ich möchte einfach nur alle <span> Elemente auslesen. Dazu hab ich mir einen DefaultHandler geschrieben, um genau diese Elemente zu behandeln. Nur soweit komme ich halt gar nicht, weil vorher schon die Exception kommt.
Gibt es eine Möglichkeit, die Prüfung auf wohlgeformtheit zu deaktivieren und trotzdem ein Dokument mit SAX zu parsen? Oder kennt jemand eine andere Möglichkeit, um Elemente aufzulesen? Ich habe auch schon versucht, einen eigenen Parser zu schreiben. Das Problem dabei ist jedoch, dass man die Datei nicht mal zeilenweise mit nem Reader einlesen kann, weil die Zeilen so lang sind, dass die Performance dabei in die Knie geht.
Der Code sieht im Moment wie folgt aus:
Code:
SaxParser parser = SAXParserFactory.newInstance().newSAXParser();
DefaultHandler handler = new SpanHandlerImpl();
parser.parse(new FileInputStream(file), handler);
...
public class SpanHandlerImpl extends DefaultHandler {
private List spans;
public SpanHandlerImpl() {
spans = new ArrayList();
}
public List getSpans() {
return spans;
}
public void startElement(String namespaceURI, String localName, String qName, Attributes attributes) throws SAXException {
if(localName.equals("span")) {
System.out.println("Span gefunden!");
}
}
public void fatalError(SAXParseException e) throws SAXException {
// nix
}
public void error(SAXParseException e) throws SAXException {
// nix
}
public void warning(SAXParseException e) throws SAXException {
// nix
}
}