使用XmlSlurper解析时,如何使用带点的配置条目

时间:2015-01-27 16:21:04

标签: grails groovy xmlslurper

我尝试使用groovy Config条目来解析xmlSlurper的xml文件。

这是Config文件:

sample {
    xml {
        frompath = "Email.From"
    }
}

这是XML

<xml>
    <Email>
        <From>
            <Address>foo@bar.com</Address>
            <Alias>Foo Bar</Alias>
        </From>
    <Email>
</xml>

这是我最初尝试过的:

XmlSlurper slurper = new XmlSlurper()

def record = slurper.parseText((new File("myfile.xml")).text)

def emailFrom = record?."${grailsApplication.config.sample.xml.frompath}".Address.text()

这不起作用,因为XmlSlurper允许在路径名中使用特殊字符,只要它们被引号括起来,因此应用程序将其翻译为:

def emailFrom = record?."Email.From".Address.text()

而不是

def emailFrom = record?.Email.From.Address.text()

我尝试将frompath属性设置为"Email"."From",然后设置为'"Email"."From"'。我尝试在解析语句中间对属性进行标记(不要问。)

有人可以指点我找一些资源,看看我是否可以做到这一点?

我觉得这个issue getting dynamic Config parameter in Grails taglib而且https://softnoise.wordpress.com/2013/07/29/grails-injecting-config-parameters/可能会有一些解决方案的低语,但我需要新鲜的眼睛才能看到它。

1 个答案:

答案 0 :(得分:1)

issue getting dynamic Config parameter in Grails taglib中的解决方案是解决此类路径的正确方法。 E.g。

def emailFrom = 'Email.From'.tokenize('.').inject(record){ r,it -> r."$it" }
def emailFromAddress = emailFrom.Address.text()

如果您的路径变得复杂而您宁愿采用可能更危险的方式,那么您也可以使用Eval。 E.g。

def path = "a[0].b.c"
def map = [a:[[b:[c:666]]]] // dummy map, same as xmlslurper
assert Eval.x(map, "x.$path") == 666