XML解析查询以从XML过滤多个数据

时间:2018-07-12 12:21:36

标签: xml postgresql

我有带有以下示例数据的XML:

<result command="searchhotels" date="2018-07-12 11:34:48" elapsedTime="0.12741708755493" ip="178.63.96.219" tID="1531395288103187" version="4.0">
<hotels>
<hotel hotelid="53754">
<rooms>
<room adults="2" children="0" extrabeds="0">
<roomType roomtypecode="59776945">

我需要通过使用Postgres中的XPath获取所有hotelid的列表。

任何相关的查询/方法都会有所帮助

1 个答案:

答案 0 :(得分:0)

发布格式良好的样本数据很难吗?当您最多花几分钟时间找出并修复该示例以为您测试解决方案时,这很烦人。

select   xpath ('//hotel/@hotelid', your_xml) 

将从所有“酒店”元素中返回属性“酒店ID”值的数组

例如,您可以从该xml中获取更多数据

with mytable as (select 
'
<result command="searchhotels" date="2018-07-12 11:34:48" elapsedTime="0.12741708755493" ip="178.63.96.219" tID="1531395288103187" version="4.0">
   <hotels>
      <hotel hotelid="53754">
         <rooms>
            <room adults="2" children="0" extrabeds="0">
               <roomType roomtypecode="59776945" />
            </room>
            <room adults="4" children="0" extrabeds="0">
               <roomType roomtypecode="59745" />
            </room>
         </rooms>
      </hotel>
      <hotel hotelid="53756">
         <rooms>
            <room adults="2" children="2" extrabeds="2">
               <roomType roomtypecode="59776949" />
            </room>
         </rooms>
      </hotel>
   </hotels>
</result>
'::xml some_xml
)
,v1 as (select unnest(zz) zz from (select   xpath ('//hotel', some_xml)zz from mytable)q1)
,v2 as (select (xpath ('//hotel/@hotelid', zz))[1] as hotelid , zz  from v1)
,v3 as (select hotelid, unnest(zz) zz from ( select hotelid, xpath ('//room', zz) zz from v2)q1)
select hotelid
       , (xpath ('//room/@adults', zz))[1] adults
       , (xpath ('//room/@children', zz))[1] as children
       , (xpath ('//room/@extrabeds', zz))[1] as extrabeds 
       , (xpath ('//room/roomType/@roomtypecode', zz))[1] as roomtypecode  
  from v3 

将导致

hotelid|adults|children|extrabeds|roomtypecode
53754  |2     |0       |0        |59776945
53754  |4     |0       |0        |59745
53756  |2     |2       |2        |59776949