具有名称空间的PostgresSQL xpath

时间:2019-10-17 12:56:52

标签: sql xml postgresql xpath namespaces

在下面的示例中,我想知道如何使用xpath函数:

  1. 该xml位于一个名为SR_DATA的表内,该表的字段DATA类型为TEXT

  2. 以下是xml文档的结构:

<?xml version="1.0" encoding="UTF-8"?>
<modulo modelCodeScheme="DocType" modelCodeSchemeVersion="01" modelCodeValue="TYPE_20a" modelCodeMeaning="SCREENING" group="groupname" type="format" xmlns="http://www.expr.com/2008/FMSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <AAAAA modelCodeScheme="MAM" modelCodeSchemeVersion="1" modelCodeValue="AN_MAM_6" modelCodeMeaning="Family1" tipodato="booleano">
        <![CDATA[false]]>
    </AAAAA>
    <BBBBB modelCodeScheme="MAM" modelCodeSchemeVersion="1" modelCodeValue="AN_MAM_8" modelCodeMeaning="Family2" tipodato="booleano">
        <![CDATA[false]]>
    </BBBBB>
</modulo>
  1. 假设我要阅读有关名为AAAAA的元素的文本,因此我的查询如下所示:
SELECT (xpath('/modulo/AAAAA/text()', XMLDATA::xml) AS status
FROM SR_DATA;

我的查询没有引发任何错误,但结果集为空;我想我必须映射NAMESPACES,但是我需要提示如何操作。

1 个答案:

答案 0 :(得分:1)

您需要在xpath函数中指定名称空间。该节点包含多个文本节点。您可以使用array_to_string函数将节点组合在一起:

SELECT TRIM(BOTH FROM array_to_string(xpath('/x:modulo/x:AAAAA/text()', XMLDATA::xml, ARRAY[
    ARRAY['x', 'http://www.expr.com/2008/FMSchema']
]), ''))
FROM SR_DATA
-- false

Demo on db<>fiddle