使用groovy访问XML元素
我需要根据传递的命令行参数解析xml文件。只有两个参数被传递给groovy程序。当两个参数都被传递时,我能够解析并得到结果,但当可选参数(第二个参数)没有被传递时,我无法让程序工作使用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
<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() }