Gabi und Sascha
Kategorien : Alle | Berlin | Bücher | Fotografie | Java | Linkhalde | Weichware | Verfassung

Eigentlich ist XML nicht sehr schwierig zu parsen. Eigentlich. Unter Java sind zwei einfach zu handhabende APIs vorhanden. DOM finde ich nicht ganz so gelungen, der Ressourcenverbrauch ist mir zu hoch. SAX ist etwas abstrakter, dafür ist der Ressourcenverbrauch geringer. Eigentlich ganz einfach. Doch dann kamen die Namespaces. Und alles XML wurde kompliziert. Naja, nicht wirklich kompliziert, doch es erfordert etwas nachdenken.

Beispielsweise können in einem öffnenden XML-Tag plötzlich Attribute stehen, die nicht definiert waren. xmlns ist so ein Attribut. Das Attribut kennzeichnet einen XML Namespace. DOM und SAX bieten Methoden an, damit der gequälte Entwickler leichter damit umgehen kann. Nachteil: man muss die Dokumentation lesen und zumindest rudimentär verstehen was passiert. Eigentlich eine Selbstverständlichkeit. Trotzdem findet man manchmal Codefragmente, die einen verzweifeln lassen. Sowas zum Beispiel:


  public void startElement(String uri, String localName, String qName, Attributes atts) {
      if ("".equals(uri)) {
          doSomething();
      }
  }
  

Sind Namespaces vorhanden, wird doSomething() nie erreicht.

Sehr beliebt auch das Vorher- Nachherspiel.

Vorher


  <simpleTag attribute='inhalt' />
  

Nachher:


  <simpleTag xmlns='namespace' attribute='inhalt' />
  

Sieht der Fehlersuchende dann solch ein Konstrukt, möchte er am liebsten in die Tischkante beissen:


  public void startElement(String uri, String localName, String qName, Attributes atts) {
      if (atts != null) {
          final String value = atts.getValue(1);
          doSomethingWithValue(value);
      }
  }    
  

Hui, gleich zwei Fehler auf einmal. Das geht wohl wirklich :-( Der Wert von value ist nicht definiert - in normalen XML ist nicht vorher zu sagen, an welcher Position welches Attribut vorkommt. Dann über einen Index auf die Daten zuzugreifen ist fahrlässig oder zeugt von einem Verständnisblindflug.

Eigentlich hätte es damit gut sein sollen. Eigentlich. Denn auch die Verwendung von public void characters(char[] ch, int start, int length) wird immer wieder falsch gemacht. Naive Entwickler gehen schlicht davon aus, dass in char[] ch immer alle #PCDATA Zeichen enhalten sind. Einfach mal das fucking Manual lesen. Erspart mir 6 Stunden debuggen in Fremdcode :-(