2016-09-13 28 views
0

我有一個包含數千行的XML列。每行包含元數據文件的xml表示。使用postgres從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>[email protected]</gco:CharacterString> 
>    </gmd:electronicMailAddress> 
>    </gmd:CI_Address> 
>   </gmd:address> 
>   </gmd:CI_Contact> 
>  </gmd:contactInfo> 
>  </gmd:CI_ResponsibleParty> 
> </gmd:contact> 

如何獲得organisationName和electronicMailAddress在XML列的所有行?查詢看起來像一個select語句是什麼?

回答

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字段。不幸的是,查詢有點長,因爲所有的命名空間的東西。

+0

如果您通過添加LIMIT 1來限制嵌套選擇查詢,那麼效果很好,否則它會返回多個行,導致查詢失敗。由於數據庫包含標準化的元數據,因此每條記錄都包含一個名爲「gmd:contact」的字段 – stopopol

+0

@stopopol是的,您是對的。我用'LATERAL'子查詢重寫了查詢,以便它對多行沒有問題。它不會從所有行中提取字段。 – redneb