Извлечение значения xml-тега в PostgreSQL

Ниже приведен ответ столбца из моей таблицы Postgres. Я хочу, чтобы извлечь все строки в моей базе данных Postgres. Статус может быть разных размеров, таких как SUCCESS также, поэтому я не хочу использовать функцию подстроки. Есть ли способ сделать это?

<?xml version="1.0" ?><response><status>ERROR_MISSING_DATA</status><responseType>COUNTRY_MISSING</responseType><country_info>USA</country_info><phone_country_code>1234</phone_country_code></response>

Итак, моя структура таблицы выглядит так

   Column    |            Type             |                        Modifiers                         

-------------+-----------------------------+----------------------------------------------------------

 id          | bigint                      | not null default nextval('events_id_seq'::regclass)
 hostname    | text                        | not null
 time        | timestamp without time zone | not null
 trn_type    | text                        | 
 db_ret_code | text                        | 
 request     | text                        | 
 response    | text                        | 
 wait_time   | text                        | 

и я хочу извлечь статус из каждого запроса. Как мне это сделать?

Ниже приведен пример строки. И примите таблицу abc_events имя

id          | 1870667
hostname    | abcd.local
time        | 2013-04-16 00:00:23.861
trn_type    | A
request     | <?xml version="1.0" ?><response><status>ERROR_MISSING_DATA</status><responseType>COUNTRY_MISSING</responseType><country_info>USA</country_info><phone_country_code>1234</phone_country_code></response>
response    | <?xml version="1.0" ?><response><status>ERROR_MISSING_DATA</status><responseType>COUNTRY_MISSING</responseType><country_info>USA</country_info><phone_country_code>1234</phone_country_code></response>

1 ответов


использовать xpath() функция:

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() полоски окрестных <status> тег.
Возвращает массив xml - С одним элементом в этом случае:

status
xml[]
-------
{ERROR_MISSING_DATA}

применяется к вашему столу

в ответ на ваш вопрос обновить, это может быть:

SELECT id, xpath('./status/text()', response::xml) AS status
FROM   tbl;

если вы уверены, что есть только один тег состояния в строке, вы можете просто извлечь первый элемент из массив:

SELECT id, (xpath('./status/text()', response::xml))[1] AS status
FROM   tbl;

если может быть несколько элементов состояния:

SELECT id, unnest(xpath('./status/text()', response::xml)) AS status
FROM   tbl;

получает 1-n строк на id.

бросил xml

поскольку вы определили, что ваши столбцы имеют тип text (вместо xml, вы нужно бросить в xml явно. Функция xpath() ожидает 2-й параметры типа xml. Нетипизированная строковая константа принуждается к xml автоматически, но text колонки нет. Вам нужно бросить явно.

это работает без явного приведения:

  SELECT xpath('./status/text()'
      ,'<?xml version="1.0" ?><response><status>SUCCESS</status></response>')

A CTE как в моем первом примере должен тип для каждого столбца В "общем табличном выражении". Если бы я не привел к определенному типу, тип unknown было бы использовано-что не то же самое как строку типа. Очевидно, что прямого преобразования нет реализовано между unknown и xml. Вам придется бросить в text первый: unknown_type_col::text::xml. Лучше бросить в ::xml сразу.

это было затянуто с помощью PostgreSQL 9.1 (я думаю). Старые версии были более терпимыми.

в любом случае, с любым из этих методов строка должна быть действительный xml или приведение (неявное или явное) вызовет исключение.