2014-04-01 14 views
5

Questo problema si è verificato di recente. Ho usato la formica per eoni e so che avrei potuto "risolvere" questo problema, ma ho pensato di chiedertelo: non offre una soluzione elegante per questo caso?Ant: come i valori delle proprietà xml-escape durante la copia di file xml con "filtering"

Problema

Quando uso formica per copiare i file XML e "popolare i valori" tramite l'attributo "filtraggio", come posso fare scappare automaticamente commerciali (e altri XML 'caratteri speciali')?

Contesto

Piuttosto che avere/esecutori a mano modificare tutti i vari file di configurazione specifici di applicazione-server installatori, li abbiamo modificare un file '' build.properties nella directory principale della nostra applicazione. copie Ant una versione pre-configurata 'fonte' del file in una directory 'target', mentre il popolamento valori dalle proprietà file

1) Build.properties ha questo valore:

JDBC_PASSWORD=smith&wesson 

2) "Source "file di configurazione ha questo elemento:

<local-tx-datasource> 
    ... 
    <password>@[email protected]</password> 
    ... 
    </local-tx-datasource> 

3) copie Ant i file XML dalla directory di configurazione 'fonte' e popola il 'JDBC_PASSWORD' (tra gli altri le proprietà) con l'attributo 'filtraggio':

<copy todir="${appserver.home.dir}" filtering="yes"> 
    <fileset dir="${appserver.conf.dir}"> 
     <include name="**/*.xml"/> 
    </fileset> 
</copy> 

4) Dato che la proprietà ha una e commerciale, il file XML risultante 'target' non è valido. (Il '&' dovrebbe essere '& amp;')

<local-tx-datasource> 
    ... 
    <password>smith&wesson</password> 
    ... 
    </local-tx-datasource> 

Risultato desiderato

invece di 4, vorrei questo:

<local-tx-datasource> 
    ... 
    <password>smith&amp;wesson</password> 
    ... 
    </local-tx-datasource> 

Ulteriori

Devo preoccuparmi dell'intero cast di charac ters ', cioè minore di, maggiore di, ecc., nonché la e commerciale.

Grazie in anticipo

+0

Ho lo stesso problema. Come hai risolto il tuo? Hai scritto un codificatore personalizzato? Grazie. –

risposta

0
JDBC_PASSWORD=smith&amp;wesson 

si tradurrà in:

<local-tx-datasource> 
    <password>smith&amp;wesson</password> 
</local-tx-datasource> 

avranno analizzato come:

<local-tx-datasource> 
    <password>smith&wesson</password> 
</local-tx-datasource> 


JDBC_PASSWORD=smith&amp;amp;wesson 

si tradurrà in:

<local-tx-datasource> 
    <password>smith&amp;amp;wesson</password> 
</local-tx-datasource> 

otterrà analizzato come:

<local-tx-datasource> 
    <password>smith&amp;wesson</password> 
</local-tx-datasource> 

analogo:

less-than : &lt;

greater-than : &gt;

0

È possibile utilizzare l'attività Ant-Contrib URLEncode (Sì, si dice Foreach sul titolo, ma questo è solo per gettare il calore fuori degli itinerari.).

È possibile utilizzare ciò per assicurarsi che tutti i valori che si stanno passando tramite <filterset/> in un file XML tokenizzato siano formattati correttamente.

È necessario definire un <taskdef/> per le attività Ant-Contrib e includere il vaso Ant Contrib.

+0

La codifica dell'URL differisce dalla codifica XML. Questa è la direzione giusta, credo che sarebbe necessario un encoder personalizzato. – user331465

0

Se non si sostituisce un valore di attributo, è sempre possibile utilizzare una sezione . La e commerciale, meno di, ecc. All'interno del CDATA non ha bisogno di essere un'entità di escape.

<local-tx-datasource> 
    ... 
    <password><![CDATA[@[email protected]]]></password> 
    ... 
</local-tx-datasource> 
Problemi correlati