XML 文件到带有 <row> 标签的 PostgreSQL
XML file to PostgreSQL with <row> tag
我正在尝试将数据从 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,所以任何快速的解决方案都会有所帮助。谢谢!
因为要解析的值是属性(不是元素),所以需要用@
关键字解析:
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;
使用 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;
我正在尝试将数据从 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,所以任何快速的解决方案都会有所帮助。谢谢!
因为要解析的值是属性(不是元素),所以需要用@
关键字解析:
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;
使用 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;