2013-05-15 28 views
5

Làm cách nào để hiển thị dấu hiệu > giống như trong phiên bản PG 9.2? Tôi không muốn nó hiển thị là >.Cách để thoát khỏi ký tự ">" trong phiên bản postgres 9.2

Query trong PostgreSQL

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

quả trong phiên bản 9.1:

{"> 3"} -- desired result 

kết quả trong phiên bản 9.2.3:

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

bất kỳ gợi ý xin vui lòng?

Cảm ơn rất nhiều!

+0

Dường như libxml tự nó đang thực hiện chuyển đổi đó; thử cho đầu vào 'xmllint' để xem ý tôi là gì. Tuy nhiên, tôi không nghĩ rằng dấu vết không bị thoát khỏi '>' là XML được định dạng hợp pháp. Việc chuyển '--noent' sang' xmllint' không có bất kỳ hiệu ứng nào, nó vẫn được thoát trên đầu ra. –

+1

Tôi ngạc nhiên khi Postgres 9.1 chấp nhận phân tích cú pháp XML không hợp lệ ... Kết quả mong muốn của bạn đơn giản là không chính xác. Nó ** phải ** được thoát. –

+0

Tôi thấy .. Bạn cũng có thể giúp với, làm thế nào để tôi thoát khỏi nó? Cảm ơn rất nhiều ! – user2383959

Trả lời

2

Vâng, nếu bạn CREATE LANGUAGE plpythonu;, bạn có thể sau đó làm như sau:

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

Sau đó, truy vấn của bạn có thể trở thành:

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

Bạn cần phải thêm việc lập chỉ mục để chọn các yếu tố từ kết quả mảng của xpath, và concat là chuyển đổi từ xml sang kiểu dữ liệu chuỗi.

Bạn cũng có thể áp dụng chức năng unescape trực tiếp - nhưng chuỗi kết quả là mảng xml được định dạng.

Các vấn đề liên quan