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