Groovy代码:
def root = new XmlParser().parseText(new File("sample.xml").getText())
void row (def path,q)
{
q.path.each {
println it.value()
}
}
row ("food.name",root)
示例xml文件链接为here。
通常,root.food.name.each{}
有效。但在上面显示的代码中它不起作用。它什么都不打印。
预期产出:
[Belgian Waffles]
[Strawberry Belgian Waffles]
[Berry-Berry Belgian Waffles]
[French Toast]
[Homestyle Breakfast]
答案 0 :(得分:3)
您可以使用inject
分割和行走路径:
void row(path, node) {
path.split('\\.').inject(node) { n, p -> n."$p" }.each {
println it.value()
}
}
def root = new XmlParser().parse('https://www.w3schools.com/xml/simple.xml')
row('food.name', root)
答案 1 :(得分:1)
我不认为你可以按照你尝试的方式做到这一点。 root.food.name.each{}
与root."food.name".each{}
不同(没有" food.name"但"食物")。另一种方法是root.food.name.each{}
获得相同的结果root["food"]["name"].each{}
。通过这种方式,您可以逐级访问xml。
答案 2 :(得分:0)
致电
q.path.each {
println it.value()
}
您不实际使用path
变量,您只是尝试获取根节点的path
元素。
root.food.name.each{}
很好,很干净。
或者你可以在循环中使用变量
path.split('.').each { q = q[it] }
q.each { println it.value() }
答案 3 :(得分:0)
您可以使用下面的脚本来提取所有食物名称,如下所示(按照内联评论):
tileSize
当然,您甚至可以在一个班轮中实现相同的目标:
//Parse from file
def xml = new XmlSlurper().parse(new File('simple.xml'))
//Get all food nodes
def foods = xml.'**'.findAll {it.name() == 'food'}
//Get food names
def foodNames = foods.collect{it.name.text()}
//Print them
foodNames.each {println it}