Измельчение XML в postgresql - PullRequest
       3

Измельчение XML в postgresql

5 голосов
/ 06 сентября 2010

В языке SQL Server 2005 T-SQL я могу уничтожить значение XML следующим образом:

SELECT
    t.c.value('./ID[1]', 'INT'),
    t.c.value('./Name[1]', 'VARCHAR(50)')
FROM @Xml.nodes('/Customer') AS t(c)

, где @Xml - это значение XML, например

'<Customer><ID>23</ID><Name>Google</Name></Customer>'

Может кто-нибудь помочьмне добиться того же результата в PostgreSQL (возможно, в PL / pgSQL)?

Ответы [ 2 ]

10 голосов
/ 08 сентября 2010

Функция 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

5 голосов
/ 06 сентября 2010

Используйте функцию xpath в PostgreSQL для обработки XML.

Редактировать: Пример:

SELECT
    xpath('/Customer/ID[1]/text()', content),
    xpath('/Customer/Name[1]/text()', content),
    *
FROM
    (SELECT '<Customer><ID>23</ID><Name>Google</Name></Customer>'::xml AS content) AS sub;
...