2016-04-04 19 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。將密鑰轉換爲字符串後,第二個模板正確執行。

相關問題