使用groovy访问XML元素

使用groovy访问XML元素,groovy,xml-parsing,Groovy,Xml Parsing,我需要根据传递的命令行参数解析xml文件。只有两个参数被传递给groovy程序。当两个参数都被传递时,我能够解析并得到结果,但当可选参数(第二个参数)没有被传递时,我无法让程序工作 <env> <environment name="qa"> <server name="qaserver1"> <vip>12.13.14.15</vip> <vip>12

我需要根据传递的命令行参数解析xml文件。只有两个参数被传递给groovy程序。当两个参数都被传递时,我能够解析并得到结果,但当可选参数(第二个参数)没有被传递时,我无法让程序工作

<env> 
    <environment name="qa">
        <server name="qaserver1">
            <vip>12.13.14.15</vip>
            <vip>12.13.14.16</vip>
        </server>
        <server name="qaserver2">
            <vip>12.13.14.17</vip>
            <vip>12.13.14.18</vip>
        </server>
    </environment>
</env>

这里有一种方法。您可以使用Groovy的内置
CliBuilder
来解析命令行参数

我在脚本中定义了XML,但您可以继续读取文件

这里的要点是
def vips
部分:必须有一个条件来检查是否提供了
serverName
。如果没有,则必须从XML获取所有服务器。注意
将执行
,无论
环境.server…
中的结果如何

def cli = new CliBuilder()
cli.envName required: true, "Environment name", args: 1
cli.serverName required: false, "Server name", args: 1
def opt = cli.parse args

if (!opt) return


def xml = '''<env> 
    <environment name="qa">
        <server name="qaserver1">
            <vip>12.13.14.15</vip>
            <vip>12.13.14.16</vip>
        </server>
        <server name="qaserver2">
            <vip>12.13.14.17</vip>
            <vip>12.13.14.18</vip>
        </server>
    </environment>
</env>'''


def envName = opt.envName
def serverName = opt.serverName
def env = new XmlSlurper().parseText xml

environment = env.environment.find { it.@name.text() == envName }

def vips = ((serverName) ? 
  { environment.server.find { it.@name == serverName } } : 
  { environment.server }
)().vip.flatten()

vips.each { println it.text() }
def cli=new CliBuilder()
cli.envName必需:true,“环境名称”,参数:1
cli.serverName必需:false,“服务器名称”,参数:1
def opt=cli.parse args
如果(!opt)返回
def xml=''
12.13.14.15
12.13.14.16
12.13.14.17
12.13.14.18
'''
def envName=opt.envName
def serverName=opt.serverName
def env=new XmlSlurper().parseText xml
environment=env.environment.find{it.@name.text()==envName}
def VIP=((服务器名)?
{environment.server.find{it.@name==serverName}}:
{environment.server}
)()vip.扁平化()
vips.each{println it.text()}

参数是什么?如果缺少值,代码应该做什么?请提供一份example@WillP envName和serverName是从命令行传递的参数。我在本例中硬编码了它们。例如,在缺少
envName
的情况下,它应该在哪个
environment
中查看?还是失败了?envName是必需的,serverName是可选参数。有趣的是,您将此问题标记为正确的问题,这有助于回答相同问题的人。
def cli = new CliBuilder()
cli.envName required: true, "Environment name", args: 1
cli.serverName required: false, "Server name", args: 1
def opt = cli.parse args

if (!opt) return


def xml = '''<env> 
    <environment name="qa">
        <server name="qaserver1">
            <vip>12.13.14.15</vip>
            <vip>12.13.14.16</vip>
        </server>
        <server name="qaserver2">
            <vip>12.13.14.17</vip>
            <vip>12.13.14.18</vip>
        </server>
    </environment>
</env>'''


def envName = opt.envName
def serverName = opt.serverName
def env = new XmlSlurper().parseText xml

environment = env.environment.find { it.@name.text() == envName }

def vips = ((serverName) ? 
  { environment.server.find { it.@name == serverName } } : 
  { environment.server }
)().vip.flatten()

vips.each { println it.text() }