Как разобрать XML в Postgres 11 и в Postgres 9.1.2 - PullRequest
0 голосов
/ 17 марта 2019

В приведенном ниже скрипте Postgres 9.1.2 выдаются правильные результаты:

1.34
5.56

В Postgres 11 он дает неправильные результаты:

null
null

Как заставить его также работать в новых версиях на Postgres?

create temp table t(x xml, nsa text[][]) on commit drop;
insert into t values(
    '<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02">
  <BkToCstmrStmt>
    <Stmt>
      <Ntry>
        <Amt Ccy="EUR">1.34</Amt>
      </Ntry>
      <Ntry>
        <Amt Ccy="EUR">5.56</Amt>
      </Ntry>
    </Stmt>
  </BkToCstmrStmt>
</Document> '::xml,
    ARRAY[ARRAY['ns','urn:iso:std:iso:20022:tech:xsd:camt.053.001.02']]);

    SELECT 
    (xpath('Amt/text()', x,nsa))[1]::text::numeric AS tasusumma
    FROM (
        SELECT unnest(xpath('/ns:Document/ns:BkToCstmrStmt/ns:Stmt/ns:Ntry', x,nsa)) as x,
        nsa
        FROM t
    ) Ntry

1 Ответ

1 голос
/ 18 марта 2019

Достаточно квалифицировать Amt с его псевдонимом пространства имен:

SELECT (xpath('ns:Amt/text()', x, nsa))[1]::text::numeric AS tasusumma
FROM (
    SELECT unnest(xpath('/ns:Document/ns:BkToCstmrStmt/ns:Stmt/ns:Ntry', x, nsa)) as x,
    nsa
    FROM t
) Ntry;

Я проверял это на 10.6;Я почти уверен, что это работает на 11 тоже.Он также работает в предыдущих версиях (протестировано на 9.6).

...