2012-12-20 14 views
11

C'è un modo per mettere una variabile di essere ampliato in una sezione CDATA in scalavariabile in CDATA a Scala

val reason = <reason><![CDATA[ {failedReason} ]]></reason> 

risposta

11

Non sono sicuro se è possibile ottenere che attraverso il supporto XML nativo, ma si poteva fare qualcosa di simile:

scala.xml.XML.loadString("<reason><![CDATA[%s]]></reason>".format(failedReason)) 

si perdono alcune delle convalide di compilazione in questo modo, ma dovrebbe darvi am elemento XML con i dati che si sta cercando. Poiché restituisce un valore scala.xml.Elem, è anche possibile incorporare il risultato in una struttura XML più grande.

EDIT

Dopo aver riflettuto su questo un po 'di più, possono essere un modo beter (e meno fragile) per fare questo. Limita la porzione di testo libero solo al CDATA, riducendo al minimo il potenziale di espressioni sbilanciate.

<reason>{ scala.xml.Unparsed("<![CDATA[%s]]>".format(failedReason)) }</reason> 
+0

Il secondo blocco non analizzata funziona alla grande! – maxfridbe

23

Potrebbe essere ancora più semplice:

val reason = <reason>{scala.xml.PCData(failedReason)}</reason> 
+1

Si potrebbe voler eseguire l'escape illegale ']]>': 'content.replaceAll ("]]> ","]]]> ")' –