添加 xmlns 属性后 PostgreSQL 查询中断

问题描述 投票:0回答:1

我有 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 属性?

postgresql xpath xml-namespaces
1个回答
0
投票

有一个解决方案,涉及在每个 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:
为前缀,并且它应该都有效。

© www.soinside.com 2019 - 2024. All rights reserved.