2016-04-04 21 views
0

我有一个名为“zzz”的小Groovy类。这个类的目的是首先演示如何成功地将绑定传递给模板引擎,从而产生输出,然后无法使用看起来相同的一组绑定绑定到另一个模板引擎。如何将XPath表达式值绑定到使用Groovy的模板

V1.template包含将与绑定一起使用以生成最终输出的基本消息。 V1.properties包含一个XPath表达式,该表达式应该从XML文档中获取值并将其添加到绑定中。 T1.xml是原始的xml输入文件。

在zzz Groovy类中,我已经在bindings1中对LastName进行了硬编码并且工作正常。但是,当我从XML文件中获取lastName值并将其添加到bindings2时,它失败。两个绑定似乎都有完全相同的文本,但我注意到bindings1的类型为Bindings,binding2的类型为Reference。

我认为是引用的bindings2是什么导致我的问题,但我不知道如何将其转换或绑定到绑定。请让我知道我做错了什么。

我使用Java 1.8与Groovy的全2.3.10.jar

zzz.groovy:

import java.io.File; 
import javax.xml.xpath.* 
import javax.xml.parsers.DocumentBuilderFactory 

class zzz { 

    def xpath 
    def records 
    def loadDocToCheck(File docToCheck) { 
     xpath = XPathFactory.newInstance().newXPath() 
     def builder = DocumentBuilderFactory.newInstance().newDocumentBuilder() 
     def inputStream = new FileInputStream(docToCheck) 
     records = builder.parse(inputStream).documentElement 
    } 

    def validateXpath(String xpathQuery) { 
     def nodes = xpath.evaluate(xpathQuery, records, XPathConstants.NODESET) 
     nodes.collect { node -> node.textContent } 
     def nodeCount = 0 
     nodes.each { nodeCount++ } 
     nodeCount 
    } 

    def getXpath(String xpathQuery) { 
     String retVal = "" 
     def nodes = xpath.evaluate(xpathQuery, records, XPathConstants.NODESET) 
     nodes.collect { node -> 
      retVal += node.getTextContent() 
     } 
     (retVal) 
    } 


    static main(args) { 
     def zzz = new zzz() 

     def testFile = new File("T1.xml") 
     zzz.loadDocToCheck(testFile) 

     def config = new ConfigSlurper().parse(new File("V1.properties").toURI().toURL()) 
     String testFileNameOnly = testFile.getName()-testFile.getParent() 

     def bindings1 = [ 
      "InputFile" : "$testFileNameOnly", 
      "LastName" : "Smith" 
     ] 

     def templateFile1 = new File('V1.template') 
     println "templateFile1=${templateFile1.getAbsolutePath()}" 
     def engine1 = new groovy.text.GStringTemplateEngine() 
     def template1 = engine1.createTemplate(templateFile1).make(bindings1) 

     println template1.toString() 


     println "******************************" 


     def bindings2 = [:] 
     bindings2 << ["InputFile":"$testFileNameOnly"] 
     config.params.each { paramName, param -> 
      bindings2 << ["$paramName" : "${zzz.getXpath(param)}"] 
     } 

     println "bindings2=$bindings2" 
     def templateFile2 = new File('V1.template') 
     println "templateFile=${templateFile2.getAbsolutePath()}" 
     def engine2 = new groovy.text.GStringTemplateEngine() 
     def template2 = engine2.createTemplate(templateFile2).make(bindings2) 

     println template2.toString() 
    } 
} 

T1.xml:

<?xml version="1.0"?> 
<MyRoot specVersion="3.03"> 
    <employee> 
     <lastName>Smith</lastName> 
     <firstName>John</firstName> 
    </employee> 
</MyRoot> 

V1.template:

Input file: ${InputFile} 
LastName: ${LastName} 

V1.properties:

params { 
    LastName = '//MyRoot/employee/lastName/text()' 
} 

回答

0

我发现为什么第二个模板将可以执行。绑定必须是Map的形式,但我传入一个GString作为地图的关键字。注意:“$ parameterName”是一个GString。将密钥转换为字符串后,第二个模板正确执行。

相关问题