使用 Postgres 解析 XML 数据
Posted
技术标签:
【中文标题】使用 Postgres 解析 XML 数据【英文标题】:Parsing XML data with Postgres 【发布时间】:2019-12-12 15:35:22 【问题描述】:PostgreSQL 9.2.4
如果我添加了重复的主题,我深表歉意,但我似乎无法弄清楚(目前)。我想解析存储在 postgres 表中的 XML 数据。
例如:
select program_information.description FROM program_information WHERE id = 8768787;
给我这样的输出:
<?xml version="1.0"?>
<ProgramInformation>
<BasicDescription>
<Title type="original">Zla smrt</Title>
<Synopsis length="short">Pet prijateljev, starih nekaj čez dvajset let, v samotni koči najde Knjigo mrtvih. S posnetka, ki so ga napravili arheologi, izvedo, da je bilo starodavno besedilo odkrito med kandarijskimi ruševinami sumerske civilizacije.</Synopsis>
<Keyword type="secondary"></Keyword>
<ParentalGuidance>
<mpeg7:ParentalRating href="rn:mpeg:MPAAParentalRatingCS:PG">
<mpeg7:Name>PG</mpeg7:Name>
</mpeg7:ParentalRating>
</ParentalGuidance>
<CreditsList>
<CreditsItem role="urn:tva:metadata:TVARoleCS:ACTOR">
<PersonName>
<mpeg7:GivenName>Bruce</mpeg7:GivenName>
<mpeg7:FamilyName>Campbell</mpeg7:FamilyName>
</PersonName>
</CreditsItem>
<CreditsItem role="urn:tva:metadata:TVARoleCS:ACTOR">
<PersonName>
<mpeg7:GivenName>Ellen</mpeg7:GivenName>
<mpeg7:FamilyName>Sandweiss</mpeg7:FamilyName>
</PersonName>
</CreditsItem>
<CreditsItem role="urn:tva:metadata:TVARoleCS:ACTOR">
<PersonName>
<mpeg7:GivenName>Betsy</mpeg7:GivenName>
<mpeg7:FamilyName>Baker</mpeg7:FamilyName>
</PersonName>
</CreditsItem>
<CreditsItem role="urn:tva:metadata:TVARoleCS:DIRECTOR">
<PersonName>
<mpeg7:GivenName>Sam</mpeg7:GivenName>
<mpeg7:FamilyName>Raimi</mpeg7:FamilyName>
</PersonName>
</CreditsItem>
</CreditsList>
<ReleaseInformation>
<ReleaseDate>
<Year>1981</Year>
</ReleaseDate>
</ReleaseInformation>
</BasicDescription>
<AVAttributes>
<AudioAttributes>
<NumOfChannels>2</NumOfChannels>
</AudioAttributes>
</AVAttributes>
</ProgramInformation>
所以我想要的是在单独的列(标题、概要、评级、演员等)中对该输出进行解析输出
所以我想要的是像
这样的输出+----------+-------------+----------------+
| Title | Synopsis | ParentalRating |
+----------+-------------+----------------+
| my title | some descr | rating |
+----------+-------------+----------------+
我已经尝试过使用 xpath,但到目前为止是死路一条……:/
谁能指导我更正查询?谢谢!
M
【问题讨论】:
您能提供到目前为止您一直在尝试的 xpath 查询吗?此外,命名空间mpeg7
是否有声明的前缀?我也没有在这个 xml 文档中找到值 8768787
。
PostgreSQL 9.2.4
【参考方案1】:
您的 XML 文档缺少命名空间声明。应该是这样吗?我在<ProgramInformation>
手动添加了一个命名空间,它工作了..
<ProgramInformation xmlns:mpeg7="http://mpeg7.io">
.. 使用以下查询:
SELECT
XPATH('//BasicDescription/Title/text()', t.xml) AS title,
XPATH('//BasicDescription/Synopsis/text()', t.xml) AS synopsis,
XPATH('//mpeg7:ParentalRating/mpeg7:Name/text()', t.xml,ARRAY[ARRAY['mpeg7', 'http://mpeg4.io']]) AS parentalRating
FROM t;
title | synopsis | parentalrating
--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------
"Zla smrt" | "Pet prijateljev, starih nekaj čez dvajset let, v samotni koči najde Knjigo mrtvih. S posnetka, ki so ga napravili arheologi, izvedo, da je bilo starodavno besedilo odkrito med kandarijskimi ruševinami sumerske civilizacije." | PG
(1 Zeile)
【讨论】:
抱歉回复晚了。这就是我必须处理的输出。我设法从中得到标题、概要和评级。您能帮我获取演员和导演字段,以及以上是关于使用 Postgres 解析 XML 数据的主要内容,如果未能解决你的问题,请参考以下文章
复习知识点:XML解析数据,JOSN解析数据,GET请求数据,POST请求数据
Postgres - 连接三个表并在查询中对数据使用聚合函数