2017-06-05 78 views
0

我正在开发一个项目,我需要解析一个XML文件并在100个不同的XML路径/节点上执行完全相同的代码。我的代码目前看起来像这样...传递XML路径和评估

def items = parser.parseText(inputFile.text) 

items.item.each { item -> 
    try { 
     // do stuff with item.some_node 
    } catch(Exception ex) { 
     //exception stuff 
    } 
    try { 
     // do stuff with item.weight_node 
    } catch(Exception ex) { 
     //exception stuff 
    } 
    try { 
     // do stuff with item.another_node[3].sub_node 
    } catch(Exception ex) { 
     //exception stuff 
    } 
    try { 
     // do stuff with item.some_node 
    } catch(Exception ex) { 
     //exception stuff 
    } 
    // do this a 100 times or so with other item node paths 
} 

由于“东西做”和异常“东西”是完全一样的,每次和改变的是我的工作节点的唯一的事。正因为如此,我宁愿送节点表达的方法或延长节点类是这样的...

def myMethod(currentNode) { 
    try { 
     // do stuff 
    } catch(Exception ex) { 
     //exception stuff 
    } 
} 

items.item.each { item -> 
    myMethod(item.some_node) 
    myMethod(item.weight_node) 
    myMethod(item.another_node[3].sub_node) 
    myMethod(item.some_node) 
} 

// OR 

def myProcess(NodeList n){ 
    try { 
     // do stuff 
    } catch(Exception ex) { 
     //exception stuff 
    } 
} 
NodeList.metaClass.myProcess = { -> myProcess(delegate) } 

items.item.each { item -> 
    item.some_node.myMethod() 
    item.weight_node.myMethod() 
    item.another_node[3].sub_node.myMethod() 
    item.some_node.myMethod() 
} 

利用该方法尝试我无法弄清楚如何将XPath的传递给方法,然后用它。只要节点实际存在,使用类扩展方法就可以工作。如果它没有,我会尝试调用myProcess时出错。

任何想法?

+0

DSCL,你尝试过解决? – Rao

回答

0

由于没有xml,所以需要一个样本xml。

您确实需要为最初提到的每个节点写入数据。

在groovy中,这是使用find(返回单个值)或findAll(多个值)很容易实现的。请看下面的例子。

def jdbcResponse = """<Results> 
    <ResultSet fetchSize="10"> 
     <Row rowNumber="1"> 
      <T1>TEXT1</T1> 
      <T2>TASK1</T2> 
      <T3>Value1</T3> 
      <T4>xyz</T4> 
     </Row> 
     <Row rowNumber="2"> 
      <T1>TEXT2</T1> 
      <T2>TASK2</T2> 
      <T3>Value1a</T3> 
      <T4>ABC</T4> 
     </Row> 
    </ResultSet> 
</Results>""" 

def xml = new XmlSlurper().parseText(jdbcResponse) 

//Return the matching element 
def getData = { elementName -> 
    xml.'**'.findAll{it.name() == elementName} 
} 

//Coerced result to List of string as T1/2 is not complex 
def t1s = getData('T1') as List<String> 
def t2s = getData('T2') as List<String> 
println t1s 

//Here you get Rows which is complex, so not coerced 
def rows = getData('Row') 
//Check if first row T1 is TEXT1 
assert rows[0].T1.text() == 'TEXT1' 
0

对于第二种情况

NodeList.metaClass.myProcess = { -> myProcess(delegate) } 

items.item.each { item -> 
    item.some_node.myMethod() 
    item.weight_node.myMethod() 
    ... 
} 

可以使用空安全的访问,以避免对不存在的节点例外:

items.item.each { item -> 
    item?.some_node?.myMethod() 
    item?.weight_node?.myMethod() 
    ... 
}