【问题标题】:Extract multiple values from xml column using postgres使用 postgres 从 xml 列中提取多个值
【发布时间】:2016-09-13 09:56:17
【问题描述】:

我有一个包含数千行的 XML 列。每行包含一个元数据文件的 xml 表示。

如何从每一行中提取多个 xml 字段? 我想我需要使用 xpath (https://www.postgresql.org/docs/current/static/functions-xml.html),但是给定的示例不足以让我理解它。

假设在“xml”表中名为“data”的行中有这个:

> <gmd:MD_Metadata xmlns:gmd="http://www.isotc211.org/2005/gmd"
> xmlns:gco="http://www.isotc211.org/2005/gco"
> xmlns:gml="http://www.opengis.net/gml"
> xmlns:xlink="http://www.w3.org/1999/xlink"
> xmlns:geonet="http://www.fao.org/geonetwork"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="http://www.isotc211.org/2005/gmd
> something.com/schemas/inspire/gmd/gmd.xsd">
> <gmd:contact>
>     <gmd:CI_ResponsibleParty>
>       <gmd:organisationName>
>         <gco:CharacterString>Something</gco:CharacterString>
>       </gmd:organisationName>
>       <gmd:contactInfo>
>         <gmd:CI_Contact>
>           <gmd:address>
>             <gmd:CI_Address>
>               <gmd:electronicMailAddress>
>                 <gco:CharacterString>something@something.com</gco:CharacterString>
>               </gmd:electronicMailAddress>
>             </gmd:CI_Address>
>           </gmd:address>
>         </gmd:CI_Contact>
>       </gmd:contactInfo>
>     </gmd:CI_ResponsibleParty>   
> </gmd:contact>

如何获取 xml 列中所有行的组织名称和电子邮件地址?查询作为 select 语句会是什么样子?

【问题讨论】:

    标签: xml postgresql xpath


    【解决方案1】:

    类似下面的东西应该可以解决问题:

    SELECT
        (xpath('//gmd:organisationName/gco:CharacterString/text()',t1,'{{gmd,http://www.isotc211.org/2005/gmd},{gco,http://www.isotc211.org/2005/gco}}'))[1]::text,
        (xpath('//gmd:electronicMailAddress/gco:CharacterString/text()',t1,'{{gmd,http://www.isotc211.org/2005/gmd},{gco,http://www.isotc211.org/2005/gco}}'))[1]::text
    FROM xml,
        LATERAL unnest((
            SELECT
                xpath('//gmd:contact',data,'{{gmd,http://www.isotc211.org/2005/gmd}}')
        )) t1;
    

    我检查xml 的所有行,并为每一行运行LATERAL 子查询以提取所有联系人。然后对于每个联系人,我提取 organisationNameCharacterString 字段。不幸的是,由于所有命名空间的东西,查询有点长。

    【讨论】:

    • 效果很好,如果你通过添加LIMIT 1来限制嵌套选择查询,否则返回多行,导致查询失败。由于数据库包含标准化的元数据,每条记录都包含一个名为“gmd:contact”的字段
    • @stopopol 是的,你是对的。我用LATERAL 子查询重写了查询,这样它就不会出现多行问题。它不会从所有行中提取字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2021-01-30
    • 2019-07-29
    • 1970-01-01
    相关资源
    最近更新 更多