我正在嘗試將資料從 XML 檔案匯入 PostgreSQL。我想從<row>標簽中的屬性創建列。問題是當我xpath用來獲取文本時,我什么也得不到。
這是一個示例輸入testinput.xml檔案
<tags>
<row Id="1" TagName=".net" Count="316293" ExcerptPostId="3624959" WikiPostId="3607476" />
<row Id="2" TagName="html" Count="1116853" ExcerptPostId="3673183" WikiPostId="3673182" />
<row Id="3" TagName="javascript" Count="2343663" ExcerptPostId="3624960" WikiPostId="3607052" />
</tags>
這是我的myquery.sql
DO $$
DECLARE xml_string xml;
BEGIN
xml_string := XMLPARSE(DOCUMENT convert_from(pg_read_binary_file('/home/me/data/testinput.xml'), 'UTF8'));
DROP TABLE IF EXISTS tags;
CREATE TABLE tags AS
SELECT
(xpath('//ID', x))[1]::text as id,
(xpath('//TagName', x))[1]::text as tagName,
(xpath('//Count', x))[1]::text as count,
(xpath('//ExcerptPostId', x))[1]::text as excerptPostId,
(xpath('//WikiPostId', x))[1]::text as wikiPostId
FROM unnest(xpath('//row', xml_string)) x;
END$$;
SELECT * FROM tags;
我懂了
id | tagname | count | excerptpostid | wikipostid
---- --------- ------- --------------- ------------
| | | |
| | | |
| | | |
(3 rows)
順便說一句,我的.xml檔案大約 100GB,所以任何快速的解決方案都會有所幫助。謝謝!
uj5u.com熱心網友回復:
使用 xmltable() 通常更容易、更靈活:
CREATE TABLE tags
AS
SELECT x.*
FROM xmltable('/tags/row' passing xml_string
columns id text path '@Id',
tag_name text path '@TagName',
"count" int path '@Count',
excerpt_post_id int path '@ExcerptPostId',
wiki_pot_id int path 'WikiPostId') as x;
uj5u.com熱心網友回復:
因為要決議的值是屬性(不是元素),所以需要用@關鍵字決議:
SELECT
(xpath('//@Id', x))[1]::text as id,
(xpath('//@TagName', x))[1]::text as tagName,
(xpath('//@Count', x))[1]::text as count,
(xpath('//@ExcerptPostId', x))[1]::text as excerptPostId,
(xpath('//@WikiPostId', x))[1]::text as wikiPostId
FROM unnest(xpath('//row', xml_string)) x;
Online Demo
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/479995.html
標籤:sql xml PostgreSQL
