2017-09-26 53 views
0

我创建了一个Postgres的表包含XML列:如何在Postgresql中查询XML列?

id   | integer 
date_created | timestamp with time zone 
hash   | character varying(10) 
original  | xml 
report_name | text 

我插入一个XML字符串:

id |   date_created   | hash |         original         |    report_name     
----+-------------------------------+------------+--------------------------------------------------------------------------+------------------------------------------ 
    9 | 2017-09-26 17:37:16.823251+02 | aaaaaaaaaa | <RequestReportResponse xmlns="http://mws.amazonaws.com/doc/2009-01-01/">+| _GET_XML_ALL_ORDERS_DATA_BY_LAST_UPDATE_ 
    |        |   | <RequestReportResult>             +| 
    |        |   |  <ReportRequestInfo>             +| 
    |        |   |  <ReportType>_GET_XML_ALL_ORDERS_DATA_BY_LAST_UPDATE_</ReportType> +| 
    |        |   |  <ReportProcessingStatus>_SUBMITTED_</ReportProcessingStatus>  +| 
    |        |   |  <EndDate>2017-09-26T13:31:02+00:00</EndDate>      +| 
    |        |   |  <Scheduled>false</Scheduled>          +| 
    |        |   |  <ReportRequestId>50064017435</ReportRequestId>     +| 
    |        |   |  <SubmittedDate>2017-09-26T13:31:02+00:00</SubmittedDate>   +| 
    |        |   |  <StartDate>2017-09-26T13:31:02+00:00</StartDate>     +| 
    |        |   |  </ReportRequestInfo>            +| 
    |        |   | </RequestReportResult>            +| 
    |        |   | <ResponseMetadata>             +| 
    |        |   |  <RequestId>e092cdbe-2978-4064-a5f6-129b88322b02</RequestId>   +| 
    |        |   | </ResponseMetadata>             +| 
    |        |   | </RequestReportResponse>            +| 
    |        |   |                   | 

online XPath的测试,我能够使用相同的XML以检索ReportRequestId价值,但查询PostgreSQL的时候我没有得到任何值回:

select xpath('/RequestReportResponse/RequestReportResult/ReportRequestInfo/ReportRequestId', original) from amazon_output where hash='aaaaaaaaaa'; 

什么我与XML数据类型不见了?

回答

1

既然你有一个XML命名空间(XMLNS),你需要包括在XPath查询:

select xpath('/mydefns:RequestReportResponse/mydefns:RequestReportResult/mydefns:ReportRequestInfo/mydefns:ReportRequestId', 
       original, 
       ARRAY[ARRAY['mydefns', 'http://mws.amazonaws.com/doc/2009-01-01/']]) 
from amazon_output where hash='aaaaaaaaaa'; 

Postgres documentation的XPath的方法:

可选的第三个该函数的参数是一个名称空间映射数组。这个数组应该是一个二维文本数组,其第二轴的长度等于2(即它应该是一个数组数组,每个数组只包含2个元素)。每个数组条目的第一个元素是名称空间名称(别名),第二个是名称空间URI。不需要这个数组中提供的别名与XML文档中使用的别名相同(换言之,在XML文档和xpath函数上下文中,别名都是本地的)。

+0

不起作用。我也尝试了一些你的答案。 – ruipacheco

+1

经过一番实验,看起来您需要在每个要搜索的元素名称之前包含名称空间前缀“mydefns”。我要更新我的答案以反映这一点。让我知道它是否有效。 –