-->

如何使用配置条目以点带时解析的XmlSlurper(How Can I Use Config Ent

2019-09-29 15:58发布

我试图用一个常规配置项,以解析与的XmlSlurper的XML文件。

这里的配置文件:

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"' 。 我试图在标记化解析的语句中间的财产(不问。)

可有人请指向我往一些资源,如果/我怎么能这样对发现的?

我觉得这个问题越来越Grails的标签库的动态配置参数 ,这https://softnoise.wordpress.com/2013/07/29/grails-injecting-config-parameters/可能有一个解决方案的耳语,但我需要新鲜的眼睛看见了。

Answer 1:

在该解决方案的问题越来越Grails的标签库动态配置参数是DEREF下来这样的路径的正确方法。 例如

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

如果您的路径有可能会很复杂,你相当具有潜在更加危险的方式去,你也可以使用Eval 。 例如

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


文章来源: How Can I Use Config Entries with Dots When Parsing with XmlSlurper