我有带有以下示例数据的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的列表。
任何相关的查询/方法都会有所帮助
答案 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