2010-09-06 5 views
5

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

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)?

ответ

10

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 Parsing in Postgres

5

Использовать the xpath-function in PostgreSQL для обработки XML.

Edit: Пример:

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; 
+1

Спасибо, я уже проверил это. Я бы хотел увидеть несколько примеров кода. – synergetic

+0

Проверьте мой пример. –

+1

Спасибо, это работает. Еще 2 подсказки будут высоко оценены. 1) Что делать, если ID - номер? 2) Что делать, если у исходного xml есть кратные партнеры ? – synergetic

Смежные вопросы