Gunakan xpath()
fungsi:
WITH x(col) AS (SELECT '<?xml version="1.0" ?><response><status>ERROR_MISSING_DATA</status></response>'::xml)
SELECT xpath('./status/text()', col) AS status
FROM x
/text()
menghapus <status>
surrounding di sekitarnya tag.
Mengembalikan larik xml
- dengan satu elemen dalam hal ini:
status
xml[]
-------
{ERROR_MISSING_DATA}
Diterapkan ke meja Anda
Menanggapi pembaruan pertanyaan Anda, ini dapat berupa:
SELECT id, xpath('./status/text()', response::xml) AS status
FROM tbl;
Jika Anda yakin hanya ada satu tag status per baris, Anda cukup mengekstrak item pertama dari larik:
SELECT id, (xpath('./status/text()', response::xml))[1] AS status
FROM tbl;
Jika ada beberapa item status:
SELECT id, unnest(xpath('./status/text()', response::xml)) AS status
FROM tbl;
Memberi Anda 1-n baris per id
.
Transmisikan ke xml
Karena Anda mendefinisikan kolom Anda bertipe text
(bukan xml
, Anda membutuhkan untuk mentransmisikan ke xml
secara eksplisit. Fungsi xpath()
mengharapkan parameter ke-2 dari tipe xml
. Konstanta string yang tidak diketik dipaksa ke xml
secara otomatis, tetapi text
kolom tidak. Anda perlu mentransmisi secara eksplisit.
Ini berfungsi tanpa pemeran eksplisit:
SELECT xpath('./status/text()'
,'<?xml version="1.0" ?><response><status>SUCCESS</status></response>')
CTE seperti pada contoh pertama saya kebutuhan tipe untuk setiap kolom dalam "ekspresi tabel umum". Jika saya tidak menggunakan tipe tertentu, tipe unknown
akan digunakan - yang tidak hal yang sama dengan string yang tidak diketik . Jelas, tidak ada konversi langsung yang diterapkan antara unknown
dan xml
. Anda harus mentransmisikan ke text
pertama:unknown_type_col::text::xml
. Lebih baik ditransmisikan ke ::xml
segera.
Ini telah diperketat dengan PostgreSQL 9.1 (saya pikir). Versi lama lebih permisif.
Either way, dengan salah satu metode ini string harus xml valid atau pemerannya (implisit atau eksplisit) akan memunculkan pengecualian.