2013-05-15 7 views
5

Come si fa a visualizzare il segno > come nella versione 9.2 di PG? Non voglio che venga visualizzato come >.Come eseguire il escape del carattere ">" nella versione postgres 9.2

query in PostgreSQL

SELECT 
XPATH ('/BehaviorReportingRanges/BehaviorReportingRange/Range/text()', 
xmlparse(content 
'<BehaviorReportingRanges> 
    <BehaviorReportingRange> 
    <Range>> 3</Range> 
    </BehaviorReportingRange> 
</BehaviorReportingRanges>')) 

Risultato in versione 9.1:

{"> 3"} -- desired result 

risultato nella versione 9.2.3:

"{"&gt; 3"}" -- not desired result 

qualsiasi puntatori per favore?

Grazie mille!

+0

Sembra che la libxml stia facendo questa trasformazione; prova a inserire l'input in 'xmllint' per vedere cosa intendo. Non pensavo che il trailing senza caratteri '>' fosse comunque un XML ben formato. Passare '--noent' a' xmllint' non ha alcun effetto, è ancora scappato in uscita. –

+1

Sono sorpreso che Postgres 9.1 accetta di analizzare l'XML non valido ... Il risultato desiderato è semplicemente errato. ** deve ** essere scappato. –

+0

Capisco .. Potresti anche aiutarti, come posso evadere? Molte grazie ! – user2383959

risposta

2

Beh, se si CREATE LANGUAGE plpythonu;, è possibile effettuare le seguenti operazioni:

create or replace function unescape(x varchar) 
    returns varchar language plpythonu as $$ 
from xml.sax.saxutils import unescape 
return unescape(x) 
$$; 

Quindi, la query può diventare:

SELECT unescape(concat((
XPATH ('/BehaviorReportingRanges/BehaviorReportingRange/Range/text()', 
xmlparse(content 
'<BehaviorReportingRanges> 
    <BehaviorReportingRange> 
    <Range>> 3</Range> 
    </BehaviorReportingRange> 
</BehaviorReportingRanges>')))[1] 
)); 

è necessario aggiungere l'indicizzazione per selezionare l'elemento da il risultato dell'array di xpath e concat è quello di convertire da xml a tipo di dati stringa.

È anche possibile applicare direttamente la funzione unescape, ma la stringa risultante è l'array xml formattato.

Problemi correlati