PostgresSQL xpath с пространствами имен - PullRequest
2 голосов
/ 17 октября 2019

Я хотел бы знать, как использовать функцию xpath в следующем примере:

  1. xml находится внутри таблицы с именем SR_DATA, поле XMLDATA типа 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>
Допустим, я хочу прочитать текст об элементе с именем AAAAA, поэтому мой запрос выглядит следующим образом:
SELECT (xpath('/modulo/AAAAA/text()', XMLDATA::xml) AS status
FROM SR_DATA;

Мой запрос не вызывает никаких ошибок, но набор результатов пуст;Полагаю, мне нужно сопоставить ИМЕНА, но мне нужен совет, как это сделать.

1 Ответ

1 голос
/ 17 октября 2019

Вам необходимо указать пространства имен в функции 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

Демонстрация на db <> fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...