为什么这个简单的代码不起作用?怎么解决这个?

时间:2017-11-03 07:29:30

标签: xml groovy

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{}有效。但在上面显示的代码中它不起作用。它什么都不打印。

更新1:

预期产出:

[Belgian Waffles]
[Strawberry Belgian Waffles]
[Berry-Berry Belgian Waffles]
[French Toast]
[Homestyle Breakfast]

4 个答案:

答案 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}