# Probleme beim Parsen von XHTML-Datei



## byte (20. Aug 2006)

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:


```
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:


```
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
	}
}
```


----------



## foobar (20. Aug 2006)

> Gibt es eine Möglichkeit, mit SAX zu parsen und solche Fehler einfach zu ignorieren? Denn mir ist das Format ansich ziemlich wurscht,


Nein, denn wenn es nicht wohlgeformt ist, kann man es auch nicht parsen. Wenn du nur ein paar Elemente extrahiern willst, bist du mit einem Regex bestimmt besser dran.


----------



## Campino (20. Aug 2006)

Ich meine die Parser aus dem JDOM-Package würden wenn sie fehler finden die Zeile oder die Zeichenzahl angeben, dass könnte dir beim suchen nach der Fehlerquelle helfen...ansonsten gibt es bestimmt Programme, die das können...


----------



## byte (20. Aug 2006)

Mit Regex wird das nicht ohne weiteres gehen, weil die Datei wie gesagt extrem groß ist. Und die Zeilen sind so lang, dass man sie nicht mal eben in einen String lesen kann. Ich müsste wohl erstmal einen Pretty Printer über die Datei laufen lassen, um sie vernünftig auslesen zu können. Oder ich müsste die Datei nicht zeilenweise einlesen sondern als bytes, aber dieses Ansatz ist mir irgendwie zu low level bzw. anstrengend. :roll:

Hätte die Datei eine vernünftige Formatierung, dann würde ich mich nicht so schwer tun. :roll:


Edit:



			
				Campino hat gesagt.:
			
		

> Ich meine die Parser aus dem JDOM-Package würden wenn sie fehler finden die Zeile oder die Zeichenzahl angeben, dass könnte dir beim suchen nach der Fehlerquelle helfen...ansonsten gibt es bestimmt Programme, die das können...



Mit JDOM hab ichs auch schon probiert. Bei mir zeigt er bloß die Zeile an, doch das hilft mir noch nicht so viel, weil die Zeilen wie gesagt extrem lang sind.

Ich hab das Ding jetzt mal über den Validator bei W3C laufen lassen und offenbar gibt es wohl ein Haufen falscher Zeichen. Die Tags stimmen aber alle, das betrifft nur den Textinhalt der Tags. Also die Datei ist quasi schon wohlgeformt, jedoch meckert der Parser halt rum. Ich kann die Datei z.b. auch im Browser angucken. Also kann die Wohlgeformtheit ja nicht so falsch sein.

Man muss doch irgendwie dem Parser mitteilen können, dass er die Textinhalte der Tags ignorieren soll. Kann ihm doch wurscht sein, was da steht, solange die Tags alle stimmen. :roll: Und nur um die gehts mir ja auch.


----------



## byte (20. Aug 2006)

Ich habe jetzt mal alle Linebreaks entfernt. Ich habe nämlich festgestellt, dass ein paar Tags durch Linebreaks getrennt wurden. Das war wohl auch ein Fehler. Aber jetzt kriege ich schon den nächsten Fehler:


```
org.xml.sax.SAXParseException: Abstandszeichen vor Attributen erforderlich
```

Offenbar waren die falschen Zeichen gar nicht das Problem, sondern es sind einfach doch einige Tags zerstört. Damit ist das Parsen mit DOM und SAX also endgültig zum Scheitern verurteilt, denn wenn die Tags nicht wohl geformt sind, kanns ja nicht funktionieren.

Ich werde mir was anderen überlegen. Trotzdem danke an alle!


----------

