# Groovy XmlSlurper und Textknoten



## equestenebrarum (7. Mai 2012)

Hallo,

via Groovy ist aus einer einfachen XML-Datei zu lesen. Als Beispiel diene diese _Home.xml_.


```
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<home>
	<room>
		living room
		<windows>
			<window orientation="north" shutters=""/>
			<window orientation="west">big window</window>
		</windows>
	</room>
</home>
```

Ausgelesen werden soll der Textknoteninhalt "living room".


```
def h = new XmlSlurper().parse(new File("Home.xml"))
r = h.room[0].text()
println "name of the room: $r"
```

Dies druckt _living roombig window_. Dazu meine Fragen:

1. Warum?
2. Wie ist an _living room_ zu kommen?

Freundliche Grüße!


----------



## Akeshihiro (8. Mai 2012)

In meinen Augen ist die XML gar nicht XML-konform. Du kannst nicht innerhalb eines Knotens Werte mit Unterknoten mischen, es müssen dann schon alle Unterknoten sein. Für dein "living room"-Wert müsstest du also auch ein Tag einfügen, z.B. title oder description oder was auch immer du dafür nehmen willst.


----------



## equestenebrarum (8. Mai 2012)

Danke für deine Antwort. Gibt es eine Quelle, die diese Aussage belegt? In Standard-Java (org.w3c.dom) hatte ich mit derart aufgebauten Dateien nie Probleme, weder beim Schreiben noch beim Lesen.


----------



## Akeshihiro (8. Mai 2012)

Also laut selfhtml und einigen anderen Seiten scheint das Mischen von Text und Knoten erlaubt zu sein. Ich persönlich mache sowas aber nicht und ehrlich gesagt rate ich auch nicht dazu, da das die Struktur und Lesbarkeit nicht unbedingt verbessert, auch wenn es scheinbar erlaubt ist. Und in deinem Fall scheint der Text eindeutig der Name oder die Bezeichnung des Raumes zu sein, da macht es wenig Sinn diese einfach so in der Luft stehen zu lassen. Entweder dafür ein Tag bereitstellen oder in diesem Fall besser sogar ein Attribut von room, weil der Name pro Raum ja nur ein mal vergeben werden kann. Das kann aber jeder machen, wie er mag. Wie gesagt, ich halte mich von solchem Mischmasch fern und scheinbar aus gutem Grund. Was Groovy angeht, so kann es sein, dass es vielleicht so strickt implementiert ist, wie ich es persönlich auch sehe oder es ist einfach nur ein ungewollter bug. Dazu kann ich nix sagen.


----------



## Thomas Darimont (8. Mai 2012)

Hallo,

muss es unbedingt der XmlSlurper sein? XmlParser liefert das gewünschte Ergebnis:

XmlSlurperExample.groovy

```
def xml = '''
<home>
    <room>
        living room
        <windows>
            <window orientation="north" shutters=""/>
            <window orientation="west">big window</window>
        </windows>
    </room>
</home>
'''
home = new XmlParser().parseText(xml);
println "Home -> Room-> " + home.room[0].text()
```

Ausgabe:

```
Home -> Room-> living room
```

Gruß Tom


----------



## Thomas Darimont (8. Mai 2012)

Hallo,

IMHO nennt man diese nicht explizit / allein in Tags eingeschlossenen Text-Fragmente (hier living room)
PCData (Parsed Character Data)

Diese und der kommt bei (X)HTML Dokumenten ganz oft vor. 
Bsp.:

```
...<p>Dies ist ein Beispiel für <b>PCDATA</b>!</p>...
```

Siehe:
http://voyager.deanza.edu/~oldham/cis92a-XML/course/wellformed-xml/well-formed-rules.html
http://www.w3schools.com/xml/xml_cdata.asp



> Ich persönlich mache sowas aber nicht und ehrlich gesagt rate ich auch nicht dazu, da das die Struktur und Lesbarkeit nicht unbedingt verbessert, auch wenn es scheinbar erlaubt ist.


Dem kann ich nur zustimmen. Ich würde dir auch empfehlen nach Möglichkeit entweder ein entsprechendes 
Attribut wie "name" am room Element zu definieren oder in einem roomName-Element einzuschließen.

Wenn du die Daten jedoch so geliefert bekommst und nichts am Format ändern kannst bleibt dir nichts anderes
übrig als einen entsprechenden Parser zu verwenden der solche PCData-Fragmente auswerten kann bzw. deine Parse-Logik
entsprechend anzupassen.

Gruß Tom


----------



## equestenebrarum (9. Mai 2012)

Hallo und danke für eure Antworten. Die obige XML-Datei hatte ich als kleines Beispiel erstellt. Auf die tatsächlich zu verarbeitenden Einfluss zu nehmen, wäre im speziellen Fall zu aufwändig.

Der Tenor scheint:

1. Das Problem liegt bei XmlSlurper, nicht in meinen Gedanken.
2. Nimm XmlParser.

Punkt 2 werde ich dann gleich in Angriff nehmen. Nochmals danke.


----------

