2016-09-13 3 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> 

은 어떻게 XML 열의 모든 행에 대한 organisationName과 electronicMailAddress을받을 수 있나요? 쿼리가 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