2011-09-30 52 views
2

是否有任何方法可以将XML文件转换为Groovy语法以用于Xml MarkupBuilder? 例如:foo.xml文件的样子:如何将XML文件转换为Groovy语法从命令行

<foo attribute1="value1" attribute2="value2"> 
    <nestedFoo> 
     sampleText 
    </nestedFoo> 
</foo> 

然后执行,我正在寻找的命令行:

<command line> foo.xml foo.groovy 

的foo.groovy会是这个样子:

foo(attribute1:'value1', attribute2:'value2') { 
    nestedFoo('sampleTest') 
} 

非常感谢。

+0

你想从XML转换为一个Groovy脚本,将生成xml时运行? –

回答

4

我想出了这一点:

鉴于一些示例XML:

def xml = """<foo attribute1="value1" attribute2="value2"> 
    <nestedFoo> 
     sampleText 
    </nestedFoo> 
</foo>""" 

然后,我们可以分析它使用XmlParser,并通过节点的工作,写数据到一个作家

def s = new XmlParser().parseText(xml) 

// Closure for writing the xml to a writer as Groovy 
// builder style code 
def dumpNode 
dumpNode = { node, writer, indent = ' ' -> 
    // Contents of the node, followed by the attributes 
    def attrs = node.text()?.trim() 
    attrs = attrs ? [ "'$attrs'" ] : [] 
    attrs = node.attributes().inject(attrs) { a, v -> 
    a << "$v.key:'$v.value'" 
    }.join(', ') 

    // write out the method definition 
    writer << "${indent}${node.name()}($attrs)" 

    writer << ' {\n' 
    node.children().each { 
    if(it instanceof Node) dumpNode(it, writer, " $indent") 
    } 
    writer << "$indent}\n" 
} 

def sw = new StringWriter() 

sw << 'println new StringWriter().with { out ->\n' 
sw << ' new groovy.xml.MarkupBuilder(out).with { smb ->\n' 

dumpNode(s, sw) 

sw << ' }\n' 
sw << ' out.toString()\n' 
sw << '}\n' 

println sw 

运行此代码打印出:

println new StringWriter().with { out -> 
    new groovy.xml.MarkupBuilder(out).with { smb -> 
    foo(attribute1:'value1', attribute2:'value2') { 
     nestedFoo('sampleText') { 
     } 
    } 
    } 
    out.toString() 
} 

然后,如果你运行在Groovy中,您可以:

<foo attribute1='value1' attribute2='value2'> 
    <nestedFoo>sampleText</nestedFoo> 
</foo> 
相关问题