XML-Element finden mit Groovy

Liebe/-r Experte/-in,

seit kurzem benutze ich Groovy für ein paar Testskripte und muss nun eine XML-Struktur editieren.

Beispiel:
Wert1

Wenn ich XPath verwende, dann könnte ich den Wert von einfach im gesamten Baum suchen mit //element1.

Wie kann ich mit Groovy so eine Suche durchführen?

Wie kann ich mit Groovy den Wert von ändern?

Ich habe bereits in das Groovy-JDK geschaut, aber daraus werde ich nicht so richtig schlau.

Vielen Dank,
Robert

Wert1

Hallo!

das sollte damit gehen:

def rootElement = new XmlParser().parseText('''Wert1''')

assert "Wert1" == rootElement."element1"[0].text()

rootElement."element1"[0].value = ["neuer Wert"]

xmlNodePrinter = new XmlNodePrinter()
xmlNodePrinter.print(rootElement)

Hallo Tobias,

vielen Dank für deine schnelle Antwort und dein Code-Beispiel. Habe erst im Nachhinein vergessen zu erwähnen, dass die Struktur des XML nicht bekannt ist, d.h. ich kann mich nicht einfach den Baum „entlanghangeln“.

Dein Code, wenn ich ihn richtig verstehe, setzt ja auch voraus, dass man die Struktur kennt und explizit über „rootElement“ und dann zu „element1“ geht.

def rootElement = new XmlParser().parseText(’’’
Wert1
‚‘’)

assert „Wert1“ == rootElement.„element1“[0].text()

rootElement.„element1“[0].value = [„neuer Wert“]

xmlNodePrinter = new XmlNodePrinter()
xmlNodePrinter.print(rootElement)

Ich dachte, dass es eventuell eine Funktion gibt, mit der man im gesamten XML-Baum nach einem bestimmten Element suchen kann. Bei der Verwendung von XPath kann man ja mit „//Name“ alle Elemente mit diesem Namen im Baum selektieren, unabhängig davon wo sie sich befinden.

Kannst du mir hier auch weiterhelfen?

Grüße aus Berlin,
Robert

Hallo Robert,

Kannst du mir hier auch weiterhelfen?

Mit folgendem Code Sollte auch das möglich sein:

def rootElement = new XmlParser().parseText('''Wert1''')

// hier machen wir aus der Baumstruktur eine flache Liste
// d.h. alle Elemente liegen dann 
def nodeList = rootElement.depthFirst()

// da wir nun alle Knoten in einer flachen Liste haben
// brauchen wir die XML-Struktur nicht zu kennen
assert "Wert1" == nodeList."element1"[0].text()

// auch das aktualisieren von Werten funktioniert auf dieser Liste
nodeList."element1"[0].value = ["neuer Wert"]

xmlNodePrinter = new XmlNodePrinter()
xmlNodePrinter.print(rootElement)

Hast Du so etwas gesucht?

Gruß
Tobias

Hallo Tobias,

super, genau das ist es :smile:

Mit folgendem Code Sollte auch das möglich sein:

def rootElement = new XmlParser().parseText(’’’
Wert1
‚‘’)

// hier machen wir aus der Baumstruktur eine flache Liste
// d.h. alle Elemente liegen dann
def nodeList = rootElement.depthFirst()

// da wir nun alle Knoten in einer flachen Liste haben
// brauchen wir die XML-Struktur nicht zu kennen
assert „Wert1“ == nodeList.„element1“[0].text()

// auch das aktualisieren von Werten funktioniert auf dieser
Liste
nodeList.„element1“[0].value = [„neuer Wert“]

xmlNodePrinter = new XmlNodePrinter()
xmlNodePrinter.print(rootElement)

Vielen Dank für deine Hilfe und ein schönes Wochenende,
Robert