You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PostgreSQL从表中XML payload提取CreDtTm节点值

在PostgreSQL中提取带命名空间的XML节点值(CreDtTm)

你的XML文档包含默认命名空间urn:iso:std:iso:20022:tech:xsd:camt.054.001.08,直接用不带命名空间的XPath查询无法匹配到节点,这就是原SQL语句取不到值的原因。以下是两种可行的解决方法:

方法一:在XPath函数中直接指定命名空间映射

SELECT unnest(xpath('/ns:Document/ns:BkToCstmrDbtCdtNtfctn/ns:GrpHdr/ns:CreDtTm/text()', 
                    xml_payload,
                    ARRAY[array['ns', 'urn:iso:std:iso:20022:tech:xsd:camt.054.001.08']])) AS cre_dt_tm
FROM wire.stages;
  • 这里用ARRAY[array['ns', '命名空间URI']]定义了命名空间别名ns,后续XPath路径中所有节点都需要加上ns:前缀来关联命名空间。

方法二:先全局设置命名空间

-- 先设置命名空间别名
SET xmlnamespace uri 'urn:iso:std:iso:20022:tech:xsd:camt.054.001.08' AS ns;

-- 再执行查询
SELECT unnest(xpath('/ns:Document/ns:BkToCstmrDbtCdtNtfctn/ns:GrpHdr/ns:CreDtTm/text()', xml_payload)) AS cre_dt_tm
FROM wire.stages;
  • 这种方式适合需要多次执行同类型XML查询的场景,一次设置后后续查询可直接使用别名。

如果每条记录仅对应一个CreDtTm节点,还可以用xpath_first简化结果:

SELECT xpath_first('/ns:Document/ns:BkToCstmrDbtCdtNtfctn/ns:GrpHdr/ns:CreDtTm/text()', 
                   xml_payload,
                   ARRAY[array['ns', 'urn:iso:std:iso:20022:tech:xsd:camt.054.001.08']]) AS cre_dt_tm
FROM wire.stages;

内容的提问来源于stack exchange,提问作者Indranisgt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 20:33:17