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;

Online Demo

使用 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;