我有一個名爲「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()'
}