# XML-Parsing: Whitespace zw. Elementen wird nicht ignoriert



## TinKim (7. Nov 2007)

Ich benutze den Xerces-Parser mit folgendem Quellcode und zur Demo mit einem einfachen XML-Dokument:


```
<?xml version="1.0" ?>
<root>
  <content attr="myattr" moreattr="moremyattr">
    thecontent
  </content>
</root>
```

Nun ist es so, dass das Dokument nicht korrekt geparst wird, wenn ich, so wie oben Zeilenumbrüche und "unnötige" Whitespaces im XML-Dokument habe.

Hier der dazugehörige Java-Code:


```
File cDir = new File(".");
    String path = cDir.getAbsolutePath();
    path = path.substring(0, path.length() - 1);
    File xmlFile = new File(path + "job.do");

      DocumentBuilderFactory factory = new DocumentBuilderFactoryImpl();
      factory.setIgnoringElementContentWhitespace(true);
      factory.setIgnoringComments(true);
      factory.setValidating(true);
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document document = builder.parse(new File(xmlFile.getAbsolutePath()));
```

Zum Aufruf von setValidating() habe ich in der Doku folges gefunden:

_setIgnoringElementContentWhitespace

public void setIgnoringElementContentWhitespace(boolean whitespace)

    Specifies that the parsers created by this factory must eliminate whitespace in element content (sometimes known loosely as 'ignorable whitespace') when parsing XML documents (see XML Rec 2.10). Note that only whitespace which is directly contained within element content that has an element only content model (see XML Rec 3.2.1) will be eliminated. Due to reliance on the content model this setting requires the parser to be in validating mode. By default the value of this is set to false._

Wenn ich also setValidating() true übergebe, bekomme ich auf der Konsole folgenden Fehler:

_Error: URI=file:/Sandboxes/p/job.do Line=1: Document root element "root", must match DOCTYPE root "null".
Error: URI=file:/Sandboxes/p/job.do Line=1: Document is invalid: no grammar found._

Wenn ich false übergebe, wird das nicht ausgegeben, aber das Ergebnis ist das gleiche. Das Dokument wird nicht korrekt durch meine Parsing-Aktionen wiedergeben.

Muss ich nun extra ein XML Schema oder eine DTD vorbereiten? Das wäre in dem Fall mit Kanonen auf Spatzen geschossen?!

Wie kriege ich also ein vollständiges "ignore whitespace" hin?
Danke und viele Grüsse,
Kim


----------



## fehlerfinder (7. Nov 2007)

TinKim hat gesagt.:
			
		

> ```
> <?xml version="1.0" ?>
> <root>
> ...
> ...


Könnte es sein, dass du das "setValidating(true)" vor den Aufruf von "setIgnoringElementContentWhitespace(true)" setzen musst?



			
				TinKim hat gesagt.:
			
		

> Wenn ich also setValidating() true übergebe, bekomme ich auf der Konsole folgenden Fehler:
> 
> 
> ```
> ...


Das sieht mir allerdings ganz danach aus, als ob dein Dokument nicht in Ordnung ist. Versuch doch mal das Folgende in Zeile 2 deiner xml-Datei einzubauen:

```
<!DOCTYPE einDocTyp>
```
und berichte von deinen Ergebnissen.


----------



## 20mithrandir (7. Nov 2007)

Du musst zwingend eine DTD verwenden, wenn du Whitespaces ignorieren willst, weil der Parser sonst nicht weiß, was er ignorieren darf und was nicht. So steht's in der API Doku jedenfalls.

Deshalb verlangt er nach einer DTD, findet keine und der Error-Handler sagt "no grammar found". Wenn du keine DTD verwenden möchtest, ignoriere doch beim Verarbeiten einfach alle nicht-relevanten Textknoten und trimme die anderen...


----------



## TinKim (7. Nov 2007)

Nein, das Dokument ist in Ordnung. Habe das Problem gerade gelöst. Ich habe nach dem ersten getFirstChild() auf die daraus resultierenden node-Typen ein weiteres getFirstChild() ausgeführt. Das lieferte mir dann ganz korrekt den Whitespace als Element-Content - mein Problem lag also ganz woanders.

Die Vorbereitung des Parsers, so wie oben beschrieben, ist also korrekt.

Trotzdem herzlichen Dank für Deine Hilfe!
Kim


----------



## TinKim (7. Nov 2007)

@ 20mithrandir
Richtig, genau das habe ich jetzt erkannt. DTD oder noch "schlimmer" XML Schema wäre für das kleine Projekt hier allerdings übel über's Ziel hinausgeschossen ;-)


----------

