Есть ли хороший XML-to-Table, который можно использовать в Java (или PostgreSQL)? - PullRequest
3 голосов
/ 19 февраля 2012

Я ищу что-то в точности как: XMLTABLE, http://www.ibm.com/developerworks/data/library/techarticle/dm-0708nicola/

Существует ли что-то подобное в PostgreSQL или что было бы ближе всего?

Или есть другой способ, есть лиБиблиотека Java, которая может выполнить это?


РЕДАКТИРОВАТЬ:

Благодаря Эрвину (ответ в его комментарии почти точно, что я искал).

Однако, возможно, я мог бы предложить расширение этого.

Предположим, у нас есть XML-документ, такой как:

<comments photo_id=“123”>
    </comment>this is the first comment</comment>
    </comment>this is the second comment</comment>
</comments>

Хотя это простой пример, учтите также, что “comment” может быть довольно сложным.

MyТеперь возникает вопрос: используя функцию XMLTable (или реализацию Эрвина), нам нужно указать path_to_data, т.е. в этом случае (/comment).

Однако, если я хочу, чтобы моя схема возврата была чем-то вроде: [photo_id, comment_text].

Нет способа получить данные от элементов родительского элемента данных.

Возможно ли каким-то образом изменить ваш код, чтобы сделать это?Я предполагаю, что есть что-то более сложное, чем функция xpath, которая по существу возвращает подмножество данных путем трассировки к родителю.

Например:

<comments photo_id=“123”>
    </comment>this is the first comment</comment>
</comments>

<comments photo_id=“123”>
    </comment>this is the second comment</comment>
</comments>

В этом случае мы можем получить доступ“/comments/@photo_id”.

Ответы [ 2 ]

2 голосов
/ 26 февраля 2012

Наконец-то у меня появилось время взглянуть поближе. Из того, что я понял в вашем примере, это может быть то, что вы ищете:

Тестовая настройка:

Я добавил еще один узел, чтобы прояснить мою точку зрения:

-- DROP TABLE t;
CREATE TEMP TABLE t (x xml);
INSERT INTO t VALUES (
'<tbl>
<comments photo_id="123">
     <comment>this is the first 123 comment</comment>
     <comment>this is the second 123 comment</comment>
</comments>
<comments photo_id="124">
     <comment>this is the first 124 comment</comment>
     <comment>this is the second 124 comment</comment>
     <comment>this is the third 124 comment</comment>
</comments>
</tbl>'::xml);

Запрос:

SELECT (xpath('./@photo_id', c.node))[1] AS photo_id
     , unnest(xpath('./comment/text()', c.node)) AS descriptor
FROM  (             
    SELECT unnest(xpath('./comments', x)) AS node
    FROM   t
    ) c;

Результат:

 photo_id |           descriptor
----------+--------------------------------
 123      | this is the first 123 comment
 123      | this is the second 123 comment
 124      | this is the first 124 comment
 124      | this is the second 124 comment
 124      | this is the third 124 comment

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

Ключевыми компонентами являются функции xpath () и unnest () . Хитрость заключается в том, чтобы сделать это в два этапа. Вы можете найти более подробное объяснение на этом связанном ответе .

0 голосов
/ 19 февраля 2012

PostgreSQL имеет поддержку типов данных XML, но не поддерживает напрямую преобразование XML в таблицу .Вы можете написать таблицу стилей XSLT для преобразования вашего XML в операторы SQL INSERT или взглянуть на инструмент отображения, такой как Castor , который может конвертировать между XML, Java-бинами и SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...