2015-04-28 83 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