使用 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 文档缺少命名空间声明。应该是这样吗?我在&lt;ProgramInformation&gt; 手动添加了一个命名空间,它工作了..

<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)

【讨论】:

抱歉回复晚了。这就是我必须处理的输出。我设法从中得到标题、概要和评级。您能帮我获取演员和导演字段,以及 中的 GivenNames 和 FamilyNames。我就是拿不出来。谢谢!

以上是关于使用 Postgres 解析 XML 数据的主要内容,如果未能解决你的问题,请参考以下文章

复习知识点:XML解析数据,JOSN解析数据,GET请求数据,POST请求数据

在 Java 中使用 SAX 解析大型 XML

Postgres - 连接三个表并在查询中对数据使用聚合函数

PHP通过XML报文格式的POST请求方式,与第三方接口交互(发送xml,获取XML,并解析xml步骤)

从 POST 方法解析/显示 XML [重复]

Spring Data 配置和 Postgres 数据库集成(无 xml 配置)