2017-03-16 76 views
1

我有一個xml文檔。把它放到posgresql表中。 這就是我所說的。在postgresql中使用xml?

create or replace function bytea_import(p_path text, p_result out bytea) 
        language plpgsql as $$ 
declare 
    l_oid oid; 
    r record; 
begin 
    p_result := ''; 
    select lo_import(p_path) into l_oid; 
    for r in (select data 
      from pg_largeobject 
      where loid = l_oid 
      order by pageno) loop 
    p_result = p_result || r.data; 
    end loop; 
    perform lo_unlink(l_oid); 
end;$$; 


insert into mydocs(docform,content) 
values (3, convert_from(bytea_import('D:/html/ex08.xml'), 'utf-8')); 

我需要更改文檔。例如

<?xml version="1.0"?> 
<list_of_items> 
<item id="1"><first/>first</item> 
<item id="2">second <sub_item>subsecond 1</sub_item></item> 
<item id="3">third</item> 
<item id="4"><last/>last</item> 
</list_of_items> 

必須從該文件取出文本並投入其他表:

first投入表1第2列

second投入表第2欄2

subsecond放入表2第3欄

third放入第4列o ˚F表2

last投產表2

加布的5列做一個很好的答案,但我有1點人的問題。 如何製作任何種類的xml。 如何刪除行像

<?xml version="1.0"?> 
<list_of_items> 
</list_of_items> 

,並選擇任何文本,不xpath搜索?

回答

0

您贏得了當天最難的問題。獲得upvote吧!

用下面的查詢:

WITH x(col) AS (
    SELECT '<?xml version="1.0"?> 
    <list_of_items> 
    <item id="1"><first/>first</item> 
    <item id="2">second <sub_item>subsecond 1</sub_item></item> 
    <item id="3">third</item> 
    <item id="4"><last/>last</item> 
    </list_of_items> 
    '::xml 
), interpreted as (
    SELECT xpath('.//item/text()', col) AS val, 
      xpath('.//sub_item/text()', col) AS val2 
    FROM x 
) 
SELECT val[1] as col1, val[2] as col2, val2[1] as col3, val[3] as col4, val[4] as col5 
FROM interpreted 
; 

你可以得到:

col1 | col2 | col3  | col4 | col5 
-------+---------+-------------+-------+------ 
first | second | subsecond 1 | third | last 
(1 row) 
+0

「我沒有足夠的錢爲這個S ***」 – Gab

+0

它可以只取得了這樣? 是否有一些常見或一般的方法適用於所有類型的XML? –

+0

你是什麼意思?這是一個簡單的解決方案,完全符合你的要求。它相當通用 – Gab