2015-04-28 51 views
-1

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

需要此代码块时的参数

// Assuming both parameters are passed, this block works 
def envName = "qa" 
def serverName = "qaserver1" 
def env = new XmlSlurper().parse("vips.xml") 
env.environment.find{ environment -> 
    [email protected] == envName 
}.server.find { server -> 
    [email protected] == serverName 
}.vip.each{ 
    println it.text() 
} 
+0

有什么参数? – Will

+0

你的代码应该做什么,如果值不存在?请提供示例 – cfrick

+0

@将P命名和serverName是从命令行传递的参数。在这个例子中我已经硬编码了。 – smhvrtyj

回答

0

不通过服务器名工作在这里是做这件事。您可以使用Groovy的内建CliBuilder来解析命令行参数。

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

这里的要点是def vips部分:必须有条件来检查是否提供了serverName。如果没有,那么所有的服务器都必须从XML中获得。无论environment.server...中的结果如何,注意.vip.flatten()都会被执行。

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 { [email protected]() == envName } 

def vips = ((serverName) ? 
    { environment.server.find { [email protected] == serverName } } : 
    { environment.server } 
)().vip.flatten() 

vips.each { println it.text() } 
+0

谢谢,这工作! – smhvrtyj

+1

有趣的是,你将这个问题标记为正确的,它可以帮助具有相同问题的人。 – Will

+0

@smhvrtyj,如果答案是有帮助的接受它。 – Opal