2016-09-16 5 views
3

Ich habe eine Geschwindigkeitsvorlage, es stellt eine XML-Datei dar. Ich bevölkere den Text zwischen den Tags mithilfe von Daten, die an ein VelocityContext-Objekt übergeben werden. Dies wird dann in der Vorlage aufgerufen. HierVelocity Template Escape XML aus Velocity Kontext

ist ein Beispiel nennen wir es myTemplate.vm:

<text>$myDocument.text</text> 

und das ist, wie ich beiläufig, dass Daten an die Geschwindigkeit Datei und den Aufbau es zur Ausgabe als String:

private String buildXml(Document pIncomingXml) 
    { 
    // setup environment 
    Properties lProperties = new Properties(); 
    lProperties.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); 

    VelocityContext lVelocityContext = new VelocityContext(); 
    lVelocityContext.put("myDocument" , pIncomingXml.getRootElement()); 

    StringWriter lOutput = new StringWriter(); 

    try 
    { 
     Velocity.init(lProperties); 
     Velocity.mergeTemplate("myTemplate.vm", "ISO-8859-1", lVelocityContext, lOutput); 
    } 
    catch (Exception lEx) 
    { 
     throw new RuntimeException("Problems running velocity template, underlying error is " + lEx.getMessage(), lEx); 
    } 
    return lOutput.toString(); 
} 

Das Problem ist, dass wenn ich auf myDocument.text innerhalb der Vorlage-Datei zugreifen, es Text ausgibt, der für XML nicht maskiert ist.

ich eine Arbeit um zu diesem durch eine VelocityContext für ein Flucht-Tool wie so hinzufügen:

lVelocityContext.put("esc", new EscapeTool()); 

dann meinen Tages im Template Einwickeln es mit:

<text>$esc.xml($myDocument.text)</text> 

Die Realität ist, Ich habe eine sehr große Vorlage und für mich, jedes Element in einem $ esc.xml-Kontext manuell zu wickeln, wird zeitaufwendig sein. Gibt es eine Möglichkeit, die Geschwindigkeit für XML beim Zugriff auf myDocument zu ändern, ohne die Vorlagendatei überhaupt zu bearbeiten?

+0

Offensichtlich Sie stellen zwei getrennte Fragen (und wahrscheinlich Bedürfnisse über sie mischen). Die erste Frage lautet: "Ist es möglich, die Geschwindigkeit für den XML-Zugriff beim Zugriff auf myDocument zu ändern, ohne die Vorlagendatei überhaupt zu bearbeiten?". Und die zweite Frage wird nicht direkt gestellt, aber Sie fühlen sich hier ein wenig gestört. Und das ist "EscapeTool.xml() ist zu langsam für mich. Wie kann ich die Xml-Escaping-Geschwindigkeit verbessern?". Bezüglich der ersten Frage ist meine Vermutung "Nein". Können Sie versuchen, smthng wie folgt zu verwenden: https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringEscapeUtils.html#escapeXml(java.lang.String) ? – rsutormin

+0

Hmm, es sieht so aus, dass StringEscapeUtils genau das ist, was in EscapeTool.xml() verwendet wird: http://grepcode.com/file/repository.springsource.com/org.apache.velocity/com.springsource.org.apache. velocity.tools.view/2.0.0/org/apache/geschwindigkeit/tools/generic/EscapeTool.java # 347. Dann können Sie nur noch überprüfen, was in der Methode toString() Ihres eingehenden Dokuments vor sich geht. Kannst du die Zeit für 'pIncomingXml.toString()' messen? – rsutormin

+0

Die Geschwindigkeit ist kein Problem. Es ist nur die manuelle Anstrengung, jedes Element einzeln zu entkommen und sein Fehlerpotential. – Suipaste

Antwort

4

Ja, es ist möglich.

Was Sie tun müssen, ist die EscapeXMLReference zu verwenden, die die reference insertion handler Schnittstelle implementiert:

lProperties.put("eventhandler.referenceinsertion.class", 
       "org.apache.velocity.app.event.implement.EscapeXmlReference"); 
+0

Fantastisches Aussehen, um genau das zu entfliehen, was ich brauchte, ohne die Vorlagendatei berühren zu müssen. – Suipaste