2016-04-04 15 views
0

kullanarak bir şablona nasıl bağlarım? "Zzz" adlı küçük bir Groovy Sınıfı var. Bu sınıfın amacı, ilk olarak, bir çıktıyı üreten şablon motoruna bağlanmanın başarılı bir şekilde geçtiğini ve daha sonra aynı bağlama dizisi olarak görünen bir başka motorla bağlanmayı göstermektir.XPath ifade değerlerini Groovy

V1.template, son çıktıyı üretmek için bağlamalarla kullanılacak temel iletiyi içerir. V1.properties, bir XML belgesinden değer alması ve bunu bağlamalara eklemesi gereken bir XPath ifadesi içerir. T1.xml ham xml giriş dosyasıdır.

Zzz Groovy Sınıfında LastName'i kodlama 1'de sabit kodladım ve işe yarıyor. Ancak, XML dosyasından lastName değerini alıp bindings2'ye eklediğimde başarısız olur. Her iki bağlamanın da tam olarak aynı metne sahip olduğu anlaşılıyor, ancak bağlamaların1 tip Bağlama ve ciltleme tip 2 olduğunu fark ettim.

Başvuru kaynağındaki bağlantıların2 sorununun neden kaynaklandığını varsayıyorum, ancak bunu Binding'e dönüştürmeyi veya dönüştürmeyi bilmiyorum. Lütfen yanlış yaptığımı bana bildirin. Ben harika-all-2.3.10.jar ile Java 1.8 kullanıyorum

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: İkinci şablon yürütebilir neden

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

cevap

0

buldum. Bağlantılar Harita şeklinde olmalıdır, ancak haritanın anahtarı olarak bir GString'de geçiyordum. Not: "$ parameterName" bir GString'dir. Anahtarı bir String'e dönüştürdükten sonra ikinci şablon doğru bir şekilde yürütüldü.