8.13. Тип XML
Тип xml пÑедназнаÑен Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ XML-даннÑÑ
. Ðго пÑеимÑÑеÑÑво по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð¾Ð±ÑÑнÑм Ñипом text в Ñом, ÑÑо он пÑовеÑÑÐµÑ Ð²Ð²Ð¾Ð´Ð¸Ð¼Ñе знаÑÐµÐ½Ð¸Ñ Ð½Ð° допÑÑÑимоÑÑÑ Ð¿Ð¾ пÑавилам XML и Ð´Ð»Ñ ÑабоÑÑ Ñ Ð½Ð¸Ð¼ еÑÑÑ ÑипобезопаÑнÑе ÑÑнкÑии; Ñм. Раздел 9.14. ÐÐ»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑого Ñипа диÑÑÑибÑÑив должен бÑÑÑ ÑкомпилиÑован в конÑигÑÑаÑии configure --with-libxml.
Тип xml Ð¼Ð¾Ð¶ÐµÑ ÑоÑ
ÑанÑÑÑ Ð¿ÑавилÑно оÑоÑмленнÑе «докÑменÑÑ», в ÑооÑвеÑÑÑвии Ñо ÑÑандаÑÑом XML, а Ñакже ÑÑагменÑÑ Â«ÑодеÑжимого», опÑеделÑемÑе как менее огÑаниÑеннÑе «ÑÐ·Ð»Ñ Ð´Ð¾ÐºÑменÑа» в модели даннÑÑ
XQuery и XPath. ÐÑÑгими Ñловами, ÑÑо ознаÑаеÑ, ÑÑо во ÑÑагменÑаÑ
ÑодеÑжимого Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑколÑко ÑлеменÑов веÑÑ
него ÑÑÐ¾Ð²Ð½Ñ Ð¸Ð»Ð¸ ÑекÑÑовÑÑ
Ñзлов. ЯвлÑеÑÑÑ Ð»Ð¸ некоÑоÑое знаÑение Ñипа xml полнÑм докÑменÑом или ÑÑагменÑом ÑодеÑжимого, позволÑÐµÑ Ð¾Ð¿ÑеделиÑÑ Ð²ÑÑажение .xml-знаÑение IS DOCUMENT
8.13.1. Создание XML-знаÑений
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð·Ð½Ð°Ñение Ñипа xml из ÑекÑÑовой ÑÑÑоки, иÑполÑзÑйÑе ÑÑнкÑÐ¸Ñ xmlparse:
XMLPARSE ( { DOCUMENT | CONTENT } value)
ÐÑимеÑÑ:
XMLPARSE (DOCUMENT '<?xml version="1.0"?><book><title>Manual</title><chapter>...</chapter></book>') XMLPARSE (CONTENT 'abc<foo>bar</foo><bar>foo</bar>')
ХоÑÑ Ð² ÑÑандаÑÑе SQL опиÑан ÑолÑко один ÑпоÑоб пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑекÑÑовÑÑ ÑÑÑок в XML-знаÑениÑ, ÑпеÑиÑиÑеÑкий ÑинÑакÑÐ¸Ñ Postgres Pro:
xml '<foo>bar</foo>' '<foo>bar</foo>'::xml
Ñоже допÑÑÑим.
Тип xml не пÑовеÑÑÐµÑ Ð²Ð²Ð¾Ð´Ð¸Ð¼Ñе знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑÑ
еме DTD (Document Type Declaration, ÐбÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ñипа докÑменÑа), даже еÑли в ниÑ
пÑиÑÑÑÑÑвÑÑÑ ÑÑÑлка на DTD. РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð² PostgreSQL Ñакже Ð½ÐµÑ Ð²ÑÑÑоенной поддеÑжки дÑÑгиÑ
ÑазновидноÑÑей ÑÑ
ем, напÑÐ¸Ð¼ÐµÑ XML Schema.
ÐбÑаÑÐ½Ð°Ñ Ð¾Ð¿ÐµÑаÑиÑ, полÑÑение ÑекÑÑовой ÑÑÑоки из xml, вÑполнÑеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑии xmlserialize:
XMLSERIALIZE ( { DOCUMENT | CONTENT } знаÑение AS Ñип )
ÐдеÑÑ Ð´Ð¾Ð¿ÑÑÑимÑй Ñип â character, character varying или text (или иÑ
пÑевдонимÑ). Рв данном ÑлÑÑае ÑÑандаÑÑ SQL пÑедÑÑмаÑÑÐ¸Ð²Ð°ÐµÑ ÑолÑко один ÑпоÑоб пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ xml в Ñип ÑекÑÑовÑÑ
ÑÑÑок, но Postgres Pro позволÑÐµÑ Ð¿ÑоÑÑо пÑивеÑÑи знаÑение к нÑÐ¶Ð½Ð¾Ð¼Ñ ÑипÑ.
ÐÑи пÑеобÑазовании ÑекÑÑовой ÑÑÑоки в Ñип xml или наобоÑÐ¾Ñ Ð±ÐµÐ· иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑнкÑий XMLPARSE и XMLSERIALIZE, вÑÐ±Ð¾Ñ Ñежима DOCUMENT или CONTENT опÑеделÑеÑÑÑ Ð¿Ð°ÑамеÑÑом конÑигÑÑаÑии ÑеанÑа «XML option», ÑÑÑановиÑÑ ÐºÐ¾ÑоÑÑй можно ÑледÑÑÑей ÑÑандаÑÑной командой:
SET XML OPTION { DOCUMENT | CONTENT };
или Ñакой командой в дÑÑ Ðµ Postgres Pro:
SET xmloption TO { DOCUMENT | CONTENT };
Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение CONTENT, Ñак ÑÑо допÑÑкаÑÑÑÑ Ð²Ñе ÑоÑÐ¼Ñ XML-даннÑÑ
.
8.13.2. ÐбÑабоÑка кодиÑовки
ÐÑли на ÑÑоÑоне ÑеÑвеÑа и клиенÑа и в XML-даннÑÑ
иÑполÑзÑÑÑÑÑ ÑазнÑе кодиÑовки Ñимволов, Ñ ÑÑим могÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÑÑ Ð¿ÑоблемÑ. Ðогда запÑоÑÑ Ð¿ÐµÑедаÑÑÑÑ Ð½Ð° ÑеÑвеÑ, а иÑ
ÑезÑлÑÑаÑÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð² обÑÑном ÑекÑÑовом Ñежиме, Postgres Pro пÑеобÑазÑÐµÑ Ð²Ñе пеÑедаваемÑе ÑекÑÑовÑе даннÑе в кодиÑÐ¾Ð²ÐºÑ Ð´Ð»Ñ ÑооÑвеÑÑÑвÑÑÑей ÑÑоÑонÑ; Ñм. Раздел 22.3. Ð Ñом ÑиÑле ÑÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¸ Ñо ÑÑÑоковÑми пÑедÑÑавлениÑми XML-даннÑÑ
, подобнÑми Ñем, ÑÑо Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð² пÑедÑдÑÑиÑ
пÑимеÑаÑ
. ÐбÑÑно ÑÑо ознаÑаеÑ, ÑÑо обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð¸Ñовки, ÑодеÑжаÑиеÑÑ Ð² XML-даннÑÑ
, могÑÑ Ð½Ðµ ÑооÑвеÑÑÑвоваÑÑ Ð´ÐµÐ¹ÑÑвиÑелÑноÑÑи, когда ÑекÑÑÐ¾Ð²Ð°Ñ ÑÑÑока пÑеобÑазÑеÑÑÑ Ð¸Ð· одной кодиÑовки в дÑÑгÑÑ Ð¿Ñи пеÑедаÑе даннÑÑ
Ð¼ÐµÐ¶Ð´Ñ ÐºÐ»Ð¸ÐµÐ½Ñом и ÑеÑвеÑом, Ñак как подобнÑе вклÑÑÑннÑе в даннÑе обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ бÑдÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ Ð°Ð²ÑомаÑиÑеÑки. ÐÐ»Ñ ÑеÑÐµÐ½Ð¸Ñ ÑÑой пÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð¸Ñовки, ÑодеÑжаÑиеÑÑ Ð² ÑекÑÑовÑÑ
ÑÑÑокаÑ
, вводимÑÑ
в Ñип xml, пÑоÑÑо игноÑиÑÑÑÑÑÑ Ð¸ пÑедполагаеÑÑÑ, ÑÑо XML-ÑодеÑжимое пÑедÑÑавлено в ÑекÑÑей кодиÑовке ÑеÑвеÑа. Ðак ÑледÑÑвие, Ð´Ð»Ñ Ð¿ÑавилÑной обÑабоÑки ÑакиÑ
ÑÑÑок Ñ XML-даннÑми ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ пеÑедаваÑÑ Ð¸Ñ
в Ñвоей ÑекÑÑей кодиÑовке. ÐÐ»Ñ ÑеÑвеÑа не важно, бÑÐ´ÐµÑ Ð»Ð¸ ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð»Ñ ÑÑого пÑеобÑазовÑваÑÑ Ð´Ð¾ÐºÑменÑÑ Ð² ÑÐ²Ð¾Ñ ÐºÐ¾Ð´Ð¸ÑовкÑ, или Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ ÐµÑ, пÑежде Ñем пеÑедаваÑÑ ÐµÐ¼Ñ Ð´Ð°Ð½Ð½Ñе. ÐÑи вÑводе знаÑÐµÐ½Ð¸Ñ Ñипа xml не ÑодеÑÐ¶Ð°Ñ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð¸Ñовки, а ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ пÑедполагаÑÑ, ÑÑо вÑе даннÑе поÑÑÑпаÑÑ Ð² его ÑекÑÑей кодиÑовке.
ÐÑли паÑамеÑÑÑ Ð·Ð°Ð¿ÑоÑа пеÑедаÑÑÑÑ Ð½Ð° ÑеÑÐ²ÐµÑ Ð¸ он возвÑаÑÐ°ÐµÑ ÑезÑлÑÑаÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð² двоиÑном Ñежиме, кодиÑовка Ñимволов не пÑеобÑазÑеÑÑÑ, Ñак ÑÑо Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð´ÑÑÐ³Ð°Ñ ÑиÑÑаÑиÑ. Ð ÑÑом ÑлÑÑае обÑÑвление кодиÑовки в XML пÑинимаеÑÑÑ Ð²Ð¾ внимание, а еÑли его неÑ, Ñо пÑедполагаеÑÑÑ, ÑÑо даннÑе закодиÑÐ¾Ð²Ð°Ð½Ñ Ð² UTF-8 (ÑÑо ÑооÑвеÑÑÑвÑÐµÑ ÑÑандаÑÑÑ XML; замеÑÑÑе, ÑÑо Postgres Pro не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ UTF-16). ÐÑи вÑводе в даннÑе бÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾ обÑÑвление кодиÑовки, вÑбÑанной на ÑÑоÑоне клиенÑа (но еÑли ÑÑо UTF-8, обÑÑвление бÑÐ´ÐµÑ Ð¾Ð¿ÑÑено).
Само Ñобой, XML-даннÑе в Postgres Pro бÑдÑÑ Ð¾Ð±ÑабаÑÑваÑÑÑÑ Ð³Ð¾Ñаздо ÑÑÑекÑивнее, когда и в XML-даннÑÑ , и на ÑÑоÑоне клиенÑа, и на ÑÑоÑоне ÑеÑвеÑа иÑполÑзÑеÑÑÑ Ð¾Ð´Ð½Ð° кодиÑовка. Так как внÑÑÑи XML-даннÑе пÑедÑÑавлÑÑÑÑÑ Ð² UTF-8, опÑималÑнÑй ваÑианÑ, когда на ÑеÑвеÑе Ñакже вÑбÑана кодиÑовка UTF-8.
Ðнимание
ÐекоÑоÑÑе XML-ÑÑнкÑии ÑпоÑÐ¾Ð±Ð½Ñ ÑабоÑаÑÑ Ð¸ÑклÑÑиÑелÑно Ñ ASCII-даннÑми, еÑли кодиÑовка ÑеÑвеÑа не UTF-8. Ð ÑаÑÑноÑÑи, ÑÑо извеÑÑÐ½Ð°Ñ Ð¾ÑобенноÑÑÑ ÑÑнкÑии xpath().
8.13.3. ÐбÑаÑение к XML-знаÑениÑм
Тип xml оÑлиÑаеÑÑÑ Ð¾Ñ Ð´ÑÑгиÑ
Ñем, ÑÑо Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ не опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ опеÑаÑоÑÑ ÑÑавнениÑ, Ñак как ÑÑÑко опÑеделÑнного и ÑнивеÑÑалÑного алгоÑиÑма ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ XML-даннÑÑ
не ÑÑÑеÑÑвÑеÑ. Ðдно из ÑледÑÑвий ÑÑого â нелÑÐ·Ñ Ð¾ÑÑилÑÑÑоваÑÑ ÑÑÑоки ÑаблиÑÑ, ÑÑавнив ÑÑÐ¾Ð»Ð±ÐµÑ xml Ñ Ð¸ÑкомÑм знаÑением. ÐоÑÑÐ¾Ð¼Ñ Ð¾Ð±ÑÑно XML-знаÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÑÑÑÑÑ Ð¾ÑделÑнÑм клÑÑевÑм полем, напÑÐ¸Ð¼ÐµÑ ID. Ðожно Ñакже ÑÑавниваÑÑ XML-знаÑениÑ, пÑеобÑазовав иÑ
ÑнаÑала в ÑекÑÑовÑе ÑÑÑоки, но замеÑÑÑе, ÑÑо Ñ ÑÑÑÑом ÑпеÑиÑики XML-даннÑÑ
ÑÑÐ¾Ñ Ð¼ÐµÑод пÑакÑиÑеÑки беÑполезен.
Ðз-за оÑÑÑÑÑÑÐ²Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑов ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñипа xml, Ð´Ð»Ñ ÑÑолбÑа ÑÑого Ñипа Ñакже нелÑÐ·Ñ ÑоздаÑÑ Ð¸Ð½Ð´ÐµÐºÑ. ÐоÑÑомÑ, когда ÑÑебÑеÑÑÑ Ð±ÑÑÑÑÑй поиÑк в XML даннÑÑ
, обойÑи ÑÑо огÑаниÑение можно, пÑÐ¸Ð²ÐµÐ´Ñ Ð´Ð°Ð½Ð½Ñе к ÑÐ¸Ð¿Ñ ÑекÑÑовой ÑÑÑоки и пÑоиндекÑиÑовав ÑÑи ÑÑÑоки, либо пÑоиндекÑиÑовав вÑÑажение XPath. ÐонеÑно Ñам запÑÐ¾Ñ Ð¿Ñи ÑÑом ÑледÑÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð¸Ñк вÑполнÑлÑÑ Ð¿Ð¾ индекÑиÑÐ¾Ð²Ð°Ð½Ð½Ð¾Ð¼Ñ Ð²ÑÑажениÑ.
ÐÐ»Ñ ÑÑкоÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¸Ñка в XML-даннÑÑ Ñакже можно иÑполÑзоваÑÑ ÑÑнкÑии полноÑекÑÑового поиÑка в Postgres Pro. Ðднако ÑÑо ÑÑебÑÐµÑ Ð¾Ð¿ÑеделÑнной подгоÑовки даннÑÑ , ÑÑо диÑÑÑибÑÑив Postgres Pro пока не поддеÑживаеÑ.