Re: Using XMLNAMESPACES with XMLEMENT

Поиск
Список
Период
Сортировка
От Pavel Stehule
Тема Re: Using XMLNAMESPACES with XMLEMENT
Дата
Msg-id CAFj8pRDf8r5kjmyT-m77G3ju3gwPg70WPoD3V8WW7dYSH4SDdg@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Using XMLNAMESPACES with XMLEMENT  (Garfield Lewis <garfield.lewis@lzlabs.com>)
Список pgsql-general
Hi

ne 26. 9. 2021 v 21:48 odesílatel Garfield Lewis <garfield.lewis@lzlabs.com> napsal:

Thx @Pavel Stehule, I’ll see if I can figure this out… 

 

Regards,

Garfield

 

From: Pavel Stehule <pavel.stehule@gmail.com>
Date: Friday, September 24, 2021 at 11:33 PM
To: Garfield Lewis <garfield.lewis@lzlabs.com>
Cc: "pgsql-general@postgresql.org" <pgsql-general@postgresql.org>
Subject: Re: Using XMLNAMESPACES with XMLEMENT

 

Hi

 

pá 24. 9. 2021 v 23:44 odesílatel Garfield Lewis <garfield.lewis@lzlabs.com> napsal:

Hi All,

 

I am attempting to port the following statement from DB2z to Postgres:

 

SELECT e.empno, e.firstnme, e.lastname,

          XMLELEMENT ( NAME "foo:Emp",

            XMLNAMESPACES('http://www.foo.com' AS "foo"),

            XMLATTRIBUTES(e.empno as "serial"),

                          e.firstnme,

                          e.lastname ) AS "Result"

       FROM EMP e

       WHERE e.edlevel = 12;

 

The NAMESPACES function is not supported by Postgres in the XMLELEMENT function. Is there any way to get this to work? I’ve looked at the WITH syntax but it doesn’t look like that will be helpful here.

 

I am afraid this is not supported in Postgres. The XMLNAMESPACE clause can be used only in XMLTABLE function. You need to make XML and in the next step you need to modify it as string with string operation.

 

It can be an interesting feature, and if it is supported by libxml2, then it can be easily implemented. But at this moment it is unsupported, and you have to use string operations - it should not be hard to use regexp.


libxml2 supports it - there is an function xmlTextWriterStartElementNS

Postgres supports only the most old version of standard in this area based on ANSI/SQL 2003. This feature was implemented later, maybe in 2006 or 2008. Postgres cannot support more modern standards because used library libxml2 doesn't support XQuery, and there is not any other free (with BSD licence C library). But this feature can be supported, and can be interesting. The implementation probably cannot be trivial, because SQL feature cannot be mapped 1:1 to libxml2 feature, but it is implementable.

I found a workaround - you can use xmlattribute instead - it is same like in Oracle https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/Oracle-Compliance-with-SQLXML2011.html#GUID-0D0F19C8-0FB7-4FDD-A55B-18839F340E17 (X080, Namespaces in XML publishing).

postgres=# select xmlelement(name "foo:Emp", XMLATTRIBUTES('http://www.foo.com' as "xmlns:foo"), xmlelement(name "foo:name", 'Pavel'));
┌──────────────────────────────────────────────────────────────────────────────┐
│                                  xmlelement                                  │
╞══════════════════════════════════════════════════════════════════════════════╡
│ <foo:Emp xmlns:foo="http://www.foo.com"><foo:name>Pavel</foo:name></foo:Emp> │
└──────────────────────────────────────────────────────────────────────────────┘
(1 row)





 

 

Regards

 

Pavel

 

 

 

 

Regards,

Garfield

В списке pgsql-general по дате отправления:

Предыдущее
От: Yi Sun
Дата:
Сообщение: Re: pg_upgrade problem as locale difference in data centers
Следующее
От: "Zwettler Markus (OIZ)"
Дата:
Сообщение: change ownership of schema public?