Функция xpath
вернет массив узлов, чтобы вы могли извлечь несколько партнеров. Обычно вы делаете что-то вроде:
SELECT (xpath('/Customer/ID/text()', node))[1]::text::int AS id,
(xpath('/Customer/Name/text()', node))[1]::text AS name,
(xpath('/Customer/Partners/ID/text()', node))::_text AS partners
FROM unnest(xpath('/Customers/Customer',
'<Customers><Customer><ID>23</ID><Name>Google</Name>
<Partners><ID>120</ID><ID>243</ID><ID>245</ID></Partners>
</Customer>
<Customer><ID>24</ID><Name>HP</Name><Partners><ID>44</ID></Partners></Customer>
<Customer><ID>25</ID><Name>IBM</Name></Customer></Customers>'::xml
)) node
Где вы используете unnest(xpath(...))
, чтобы разбить большой кусок xml на куски размером с строку; и xpath()
для извлечения отдельных значений. Извлечение первого значения из массива XML, приведение к text
, а затем приведение к int
(или date
, numeric
и т. Д.) Не очень удобно. У меня есть некоторые вспомогательные функции в моем блоге, чтобы упростить эту задачу, см. Синтаксический анализ XML в Postgres