Groovy XmlSlurper und Textknoten

Hallo,

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

Code:
<?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".

Code:
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!
 
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.
 
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.
 
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(n) 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.
 
Hallo,

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

XmlSlurperExample.groovy
Java:
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:
Code:
Home -> Room-> living room

Gruß Tom
 
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.:
HTML:
...<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
 
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.
 
Zurück