使用postgres从xml列中提取多个值

时间:2016-09-13 09:56:17

标签: xml postgresql xpath

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

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

让我们假设它连续被称为"数据"在表格" xml":

> <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列中所有行的organisationName和electronicMailAddress?查询作为select语句会是什么样的?

1 个答案:

答案 0 :(得分: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字段。不幸的是,由于所有命名空间的东西,查询有点长。