2016-06-24 5 views
0

Wir haben eine App mit Groovy SimpleTemplateEngine, um Textdokumente zu generieren. Die Eingabe ist ein geparsten XML-Dokument, und wir können in der Vorlage eines dieser Felder aus Ausdrücke im Allgemeinen verweisen:Groovy SimpleTemplateEngine und XML-Array-Variablen

def xml = new XmlParser().parseText(xmldocument) 
def engine = new SimpleTemplateEngine() 
def script = new File(template_file).text 
def vars = [xml: xml, ... ] 
output = engine.createTemplate(script).make(vars).toString() 

Im Template-Skript, wir Elemente aus dem XML-Dokument verweisen auf ein Groovy Ausdruck Syntax wie folgt aus: Hello ${xml.FirstName} (vorausgesetzt, "FirstName" ist Teil des oben analysierten XML).

Das Problem, das wir haben, ist zu verstehen, die Syntax zu verwenden, wenn Elemente in einem XML-Array verweisen. Zum Beispiel haben wir XML wie folgt aus:

<Contact> 
    <Name>111</Name> 
    <Phone>111</Phone> 
</Contact> 
<Contact> 
    <Name>222</Name> 
    <Phone>222</Phone> 
</Contact> 

Was wäre die Syntax des Ausdrucks in der Template-Datei, die uns lassen würde Verweis (sagen wir) den Namen und die Telefonnummer des zweiten Kontakt? Wir haben versucht, Variationen auf ${xml.Contact[1].Name}, aber das scheint nicht zu funktionieren.

Antwort

1

die XML (korrigiert Bei </Phone> schließen Tags haben:

def xmldocument = '''<Contacts> 
        | <Contact> 
        |  <Name>111</Name> 
        |  <Phone>111</Phone> 
        | </Contact> 
        | <Contact> 
        |  <Name>222</Name> 
        |  <Phone>222</Phone> 
        | </Contact> 
        |</Contacts>'''.stripMargin()  

def xml = new XmlParser().parseText(xmldocument) 

Und die Vorlage:

def script = 'Hello ${xml.Contact[1].Name.text()}' 

Dann können Sie tun:

import groovy.text.* 

def engine = new SimpleTemplateEngine() 
def vars = [xml: xml] 
output = engine.createTemplate(script).make(vars).toString() 

Und

assert output == 'Hello 222' 

Wird passieren

+0

Entschuldigung für die schlampige XML, und danke für die schnelle Antwort. –

+0

Ihre Probe funktioniert - das ist eine gute Sache, denn Ihre ist die Syntax, von der wir erwartet haben, dass sie die ganze Zeit funktioniert. Dennoch erhalten wir leider eine Ausnahme (Keine Signatur der Methode: java.lang.Integer.getAt() ist für Argumenttypen anwendbar: (java.lang.Integer) Werte: [1]) beim Aufruf von createTemplate() wenn Wir laufen gegen Live-Daten. Mehr Debugging zu tun ... –

+1

Okay, wir fanden das Problem ... ein anderes Feld in der Vorlagendatei, die wir verwenden verwiesen eine XML-Variable, die zufällig einen eingebetteten Bindestrich hatte. Da diese Dateien automatisch erzeugt werden, war es für uns nicht so offensichtlich, bis wir einen tieferen Einblick hatten, und dann sahen wir einen Ausdruck wie diesen: $ {xml.user-name.FirstName.text()}. Den Variablennamen in einfache Anführungszeichen zu schreiben - $ {xml.'user-name'.FirstName.text() - schien den Trick zu machen. –