PostgreSQL 中的 xpath 和命名空间

3

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

  1. XML位于名为SR_DATA的表格内,字段类型为TEXT的XMLDATA中

  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>

假设我想阅读关于名为AAAAA的元素的文本,那么我的查询应该像这样:
SELECT (xpath('/modulo/AAAAA/text()', XMLDATA::xml) AS status
FROM SR_DATA;

我的查询没有引发任何错误,但结果集为空; 我想我需要映射名称空间,但我需要关于如何执行此操作的提示。


由于某些原因,xmlns 在此处存在问题:https://dbfiddle.uk/?rdbms=postgres_12&fiddle=e6e8c46176ff4a7fe0c7bb4772baa3fc 但我不知道为什么。该问题已在此处描述:https://postgrespro.com/list/thread-id/1967027,但没有解决方案。 - S-Man
1个回答

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接