| 

.NET C# Java Javascript Exception

XML - StreamingMarkupBuilder

Dies ist das Archiv des ehemaligen Forums zum Thema Groovy, Grails, Griffon und Bean Scripting Framework, welches unter groovy-forum.de existierte. Die neue Adresse des Groovy-Forums ist: http://codekicker.de/fragen/themen/groovy.


XML - StreamingMarkupBuilder

roodi - 16.09.2010 20:10
Moin!

Ich arbeite zur Zeit an einer Webapplikation, die unter anderem diverse Objekte als XML exportieren können soll.

stark vereinfacht sieht der Code wie folgt aus:

Language: Groovy
def builder = new StreamingMarkupBuilder() def out= builder.bind { root{ node(name:"foo"){ children{ node.children.each{->n node n.name } } } } }

Daraus sollte dann in etwa folgendes XML werden:

Language: HTML
<root> <node name="foo"> <children> <node>foo1</node> <node>foo2</node> <node>foo3</node> </children> </node> </root>

Es handelt sich also um nodes, die wiederum nodes als Kinder enthalten können. Prinzipiell kann jede node unendlich viele Kinder und die wiederum unendliche viele Kinder haben. Die frage ist nun, wie ich obigen Code ergänzen kann, um auch die Kinder der Kinder der Kinder... zu bekommen? Ich würde das Problem gerne mit closures lösen, bin aber was die Syntax und das Verständnis von Groovy angeht noch nicht weit genug.

Ich würde mich freuen, wenn jemand Rat weiß.


XML - StreamingMarkupBuilder

roodi - 16.09.2010 20:10
Moin! <_42_52_ /> <_42_52_ /> Ich arbeite zur Zeit an einer Webapplikation, die unter anderem diverse Objekte als XML exportieren können soll. <_42_52_ /> <_42_52_ /> stark vereinfacht sieht der Code wie folgt aus: <_42_52_ /> <_42_52_ /> <_50_52_45_ CLASS="groovy bbcode_geshi"><_44_49_56_ CLASS="head">Language: Groovy<_41_ HREF="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><_53_50_41_4e_ CLASS="kw2">def builder <_53_50_41_4e_ CLASS="sy0">= <_41_ HREF="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20new"><_53_50_41_4e_ CLASS="kw2">new StreamingMarkupBuilder<_53_50_41_4e_ CLASS="br0">(<_53_50_41_4e_ CLASS="br0">) <_41_ HREF="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20def"><_53_50_41_4e_ CLASS="kw2">def out<_53_50_41_4e_ CLASS="sy0">= builder.<_53_50_41_4e_ CLASS="me1">bind <_53_50_41_4e_ CLASS="br0">{ root<_53_50_41_4e_ CLASS="br0">{ node<_53_50_41_4e_ CLASS="br0">(name:<_53_50_41_4e_ CLASS="st0">"foo"<_53_50_41_4e_ CLASS="br0">)<_53_50_41_4e_ CLASS="br0">{ children<_53_50_41_4e_ CLASS="br0">{ node.<_53_50_41_4e_ CLASS="me1">children.<_41_ HREF="http://www.google.de/search?q=site%3Adocs.codehaus.org/%20each"><_53_50_41_4e_ CLASS="kw5">each<_53_50_41_4e_ CLASS="br0">{<_53_50_41_4e_ CLASS="sy0">->n node n.<span class="me1">name <_53_50_41_4e_ CLASS="br0">} <_53_50_41_4e_ CLASS="br0">} <_53_50_41_4e_ CLASS="br0">} <_53_50_41_4e_ CLASS="br0">} <_53_50_41_4e_ CLASS="br0">} <_42_52_ /> Daraus sollte dann in etwa folgendes XML werden: <_42_52_ /> <_42_52_ /> <_50_52_45_ CLASS="html4strict bbcode_geshi"><_44_49_56_ CLASS="head">Language: HTML<_53_50_41_4e_ CLASS="sc2"><root> <_53_50_41_4e_ CLASS="sc2"><node <_53_50_41_4e_ CLASS="kw3">name<_53_50_41_4e_ CLASS="sy0">=<_53_50_41_4e_ CLASS="st0">"foo"> <_53_50_41_4e_ CLASS="sc2"><children> <_53_50_41_4e_ CLASS="sc2"><node>foo1<_53_50_41_4e_ CLASS="sc2"><<_53_50_41_4e_ CLASS="sy0">/node> <_53_50_41_4e_ CLASS="sc2"><node>foo2<_53_50_41_4e_ CLASS="sc2"><<_53_50_41_4e_ CLASS="sy0">/node> <_53_50_41_4e_ CLASS="sc2"><node>foo3<_53_50_41_4e_ CLASS="sc2"><<_53_50_41_4e_ CLASS="sy0">/node> <_53_50_41_4e_ CLASS="sc2"><<_53_50_41_4e_ CLASS="sy0">/children> <_53_50_41_4e_ CLASS="sc2"><<_53_50_41_4e_ CLASS="sy0">/node> <_53_50_41_4e_ CLASS="sc2"><<_53_50_41_4e_ CLASS="sy0">/root> <_42_52_ /> Es handelt sich also um nodes, die wiederum nodes als Kinder enthalten können. Prinzipiell kann jede node unendlich viele Kinder und die wiederum unendliche viele Kinder haben. Die frage ist nun, wie ich obigen Code ergänzen kann, um auch die Kinder der Kinder der Kinder... zu bekommen? Ich würde das Problem gerne mit closures lösen, bin aber was die Syntax und das Verständnis von Groovy angeht noch nicht weit genug. <_42_52_ /> <_42_52_ /> Ich würde mich freuen, wenn jemand Rat weiß.


Re: XML - StreamingMarkupBuilder

Wicki - 18.09.2010 20:06
Hallo,

ich weiß nicht genau was Du erreichen willst, habe aber ein Skript als Vorschlag. Der Code für den MarkupBuilder wird nach den Vorgaben in der for-Schleife generiert und am Ende dann per "evaluate" ausgeführt.

import groovy.xml.MarkupBuilder

def xml=new StringWriter()
//def xml=new FileWriter(file = new File("build2.xml"))  //Ausgabe in Datei

anzNodes=3  //Zahl der Kindknoten
tiefe=2     //Schachtelungstiefe
builder = new MarkupBuilder(xml)   
text=""
j=0
for (i=1; i<=tiefe; i++) {
  id=10**i
  text=text +
  """
    children{
     1.upto(anzNodes){
       node(name:"foo"+(it*($id))){
  """
}
text+='}'*(tiefe*anzNodes)  //schliessende Klammern hinzufügen
//println text
def out= """
   builder.root {
     node(name:"foo"){
       $text
     }
   }
"""

evaluate(out)  //generiertes Markup-Skript ausführen
if (xml instanceof FileWriter)
  println file.text
else
  println xml

Gruß Wicki


Stelle deine Groovy-Frage jetzt!


Diese Seite zeigt den Thread "XML - StreamingMarkupBuilder" der ehemaligen Webseite groovy-forum.de, welche durch einen Serverunfall zerstört wurde. codekicker.de hat viele Konversationen über die beliebte Programmiersprache Groovy und zugehörige Frameworks wie das Grails-Framework retten können.

Hast Du eine Frage zum Thema Groovy, Grails oder allgemein Java? Viele ehemalige groovy-forum.de Mitglieder beantworten dir auf codekicker.de deine Frage! Stelle jetzt eine Frage!

Viele weitere Diskussionen zu Grails und Groovy befinden sich auf der Threadübersicht des alten groovy-forum.de.