我有 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:
为前缀,并且它应该都有效。