PostgreSQL查询在添加xmlns属性后中断



我有PostgreSQL查询:

SELECT
(xpath('//TypeCode/text()', myTempTable.myXmlColumn))[1]::text AS c1
,(xpath('//TypeName/text()', myTempTable.myXmlColumn))[1]::text AS c2
,(xpath('//BookDate/text()', myTempTable.myXmlColumn))[1]::text AS c3
,(xpath('//BankRef/text()', myTempTable.myXmlColumn))[1]::text AS c4
,(xpath('//AccAmt/text()', myTempTable.myXmlColumn))[1]::text AS c5
,myTempTable.myXmlColumn as myXmlElement
FROM 
unnest(
xpath(
'/FIDAVISTA/Statement/AccountSet/CcyStmt/TrxSet',
XMLPARSE(document (SELECT xml_data FROM bank_xml WHERE id = 1))
)
) AS myTempTable(myXmlColumn)
;

它从网上银行XML中选择数据,并从表bank_xml字段xml_data中选择交易数据。只要不存在xmlns属性,一切都可以正常工作。如果我们加上

xmlns="http://ivis.eps.gov.lv/XMLSchemas/100017/fidavista/v1-2" 

对根节点查询返回0条记录。

如何修改查询以忽略XML根节点中的xmlns属性?

有一个解决方案,它涉及在每个XPath查询中明确指定名称空间。

您需要为xpath函数提供一个名称空间映射数组。每个名称空间映射都是一个数组,其第一个元素是名称空间前缀,例如f,其第二个元素是名称空间URI(例如在您的示例中是http://ivis.eps.gov.lv/XMLSchemas/100017/fidavista/v1-2)。请参阅包含示例的文档:

https://www.postgresql.org/docs/current/functions-xml.html id-1.5.8.21.7.3.2

如果您将前缀f映射到该名称空间URI,那么您可以更改XPath表达式,以便元素名称都以f:为前缀,并且它应该都能工作。