使用新的“文件”节点在Gradle / Groovy中处理XML

时间:2017-10-23 11:25:40

标签: xml gradle groovy xmlslurper

我正试图操纵一只野生动物10.1。 standalone.xml通过gradle buildscript修改记录器设置。我以前做过这个,并且使用记录器条目,这可以按预期工作。但是,现在我需要添加一个新的periodic-rotating-file-handler,它本身不是问题,但在尝试告诉实际登录的文件时它会起作用。

现有代码:

def configFile = {wildflyDir}/standalone/configuration/standalone.xml"
def xml = new XmlSlurper(false,false).parse(configFile)
def logging = xml.profile.subsystem.find{ it['@xmlns'] == "urn:jboss:domain:logging:3.0' }
logging.appendNode {
    logger(category:"loggingCategory") {
        level(name:"LEVEL")
    }
}

正如所料,这是非常实用的。现在我需要添加一个这样的代码段:

<periodic-rotating-file-handler>
    <formatter>
        <named-formatter name="PATTERN" />
    </formatter>
    <file path="file.log" relative-to="jboss.logging.dir" />
    <suffix value=".yyyy-MM-dd" />
    <append value="true" />
</periodic-rotating-file-handler>

file定义中存在问题,因为build.gradle文件中的问题如下所示:

file(path:"file.log" "relative-to":"jboss.logging.dir")

这被Gradle解释为new File(arg1, arg2),所以基本上它试图将带有给定参数的文件对象添加到XML中。

这是有效的,但绝对不是我想要的,因为我只需要相应的XML节点。我试图以多种方式逃避:

  • 使用单引号,双引号,三引号转义file,使其成为斜线和美元字符串 - &gt;试图创建一个File对象
  • 使用相同的选项逃脱整条线路 - &gt; XML中没有行
  • 尝试添加没有括号的节点 - &gt;试图创建File对象
  • 尝试添加额外的封闭 - &gt;试图创建File对象
  • 尝试将节点解压缩为文本,解析使用XMLSlurper并将其添加到XML - &gt; XML中不存在代码段

我尝试了更多的东西,但由于沮丧,我无法回想起它们。

我最后的尝试是尝试向XML添加一个空file节点,但是当使用file() gradle时,不知道要使用哪个File-constructor,以及何时使用{{1我收到了一个错误:file

如果有人知道如何正确转义Namespace prefix: file is not bound to a URI或有另一种方法将所述file - 节点添加到XML,请告诉我。

谢谢。

1 个答案:

答案 0 :(得分:2)

(1)委托上的调用构建器函数:

//just declare `file` to emulate problem in usual groovy console 
def file={String a, String b-> println "file: a=$a, b=$b"}

def xml = new XmlSlurper(false,false).parseText('''
    <root>
        <profile>
            <subsystem xmlns="urn:jboss:domain:logging:3.0"/>
        </profile>
    </root>''')

def logging = xml.profile.subsystem.find{ it['@xmlns'] == "urn:jboss:domain:logging:3.0" }

logging.plus{
    logger(category:"loggingCategory") {
        level(name:"LEVEL")
    }
    //be specific that you want to call file function on delegate and not on owner (by default)
    delegate.'file'(path:"file.log", "relative-to":"jboss.logging.dir")
    //or this also works:
    "${'file'}"(path:"file.log", "relative-to":"jboss.logging.dir")

}

println groovy.xml.XmlUtil.serialize(xml)

(2)使用XmlParser解决方法:

使用current作为当前父节点的访问者

def xml = new XmlParser(false,false).parseText('''
    <root>
        <profile>
            <subsystem xmlns="urn:jboss:domain:logging:3.0"/>
        </profile>
    </root>''')

def logging = xml.profile.subsystem.find{ it['@xmlns'] == "urn:jboss:domain:logging:3.0" }

logging.plus{
    logger(category:"loggingCategory") {
        level(name:"LEVEL")
    }
    current.appendNode("file", [path:"file.log", "relative-to":"jboss.logging.dir"])
}

println groovy.xml.XmlUtil.serialize(xml)