使用postgresql查询获取xmlns数据的数组属性的值和索引

时间:2019-01-04 13:41:45

标签: xml postgresql xpath

<sample-test-data-history xmlns="dmotorworks.com/sample-test-data-history"> <payPaymentCode> 
<V Idx="1">CASH</V>
 </payPaymentCode>
 <StatusCode>C98</StatusCode> 
<Type> 
<V Idx="1">Cat</V> 
<V Idx="2">Mouse</V> 
<V Idx="3">Tree</V> 
</Type> 
<totMiscCost> 
<V Idx="1">100.00</V> 
<V Idx="2">150.00</V> 
<V Idx="3">200.00</V> 
</totMiscCost> 
</sample-test-data-history> 

从此xmlns中,我需要获取文本为“ cat”的数组的idx值,并基于该idx值,我需要从具有相同idx值的下一个数组属性获取totMiscCost

1 个答案:

答案 0 :(得分:0)

您可以使用xpath()来使用XPath表达式提取XML的一部分。它将返回一个匹配项数组,因此如果需要标量,则需要选择所需的索引。

在最后一个可选参数xpath()中,可以给定一个to元素的数组,该数组定义了名称空间映射。

在您的情况下,XPath表达式获取文本totMiscCost/V,其中属性Idx的值等于具有相同名称Type/V的属性的值。请注意,必须为元素添加名称空间别名作为前缀。

SELECT (xpath('(//dns:totMiscCost/dns:V[@Idx=//dns:Type/dns:V[text()="Cat"]/@Idx]/text())[1]',
              nmuloc,
              ARRAY[ARRAY['dns',
                      'dmotorworks.com/sample-test-data-history']]))[1]
       FROM elbat;

db<>fiddle