Postgres xmlelement кодировка - PullRequest
       23

Postgres xmlelement кодировка

3 голосов
/ 22 сентября 2011

Моя база данных postgres в UTF-8 и клиент в UTF-8.
Когда я пытаюсь:

select xmlelement(name pampam, xmlattributes('русский' as "top"));

Я возвращаюсь:

<pampam top="&#x440;&#x443;&#x441;&#x441;&#x43A;&#x438;&#x439;"/>`  

Но яхотите вернуть атрибут как есть (т.е. в русском UTF-8), а не как &#x440 ....
Как я могу это сделать?


Это не решает проблему, я используюxmleliment для построения xml из данных, возвращаемых по запросам.И я не могу найти другой способ сделать это ...

Ответы [ 4 ]

1 голос
/ 22 сентября 2011

Это не представляется возможным. Значения для печати передаются в libxml, и именно так он печатает его.

0 голосов
/ 03 марта 2017

Я использовал plpythonu для написания функции, используя lxml

CREATE OR REPLACE FUNCTION xmlelementpy (
              nodename_in varchar,
              nodetext_in text,
              attrname_in varchar [],
              attrvalue_in varchar []
)
RETURNS xml AS
$body$
from lxml import etree
noattr = 0
isxml = 1
if (attrname_in is None) or (attrname_in is None):
    noattr = 1
elif len(attrname_in) <> len(attrvalue_in):
    return None;

newnode = etree.Element(nodename_in)
if nodetext_in is not None:
    try: 
        schema = etree.fromstring(nodetext_in)
    except: 
        newnode.text = nodetext_in
        isxml = 0
    if isxml <> 0:
        newnode.append(etree.XML(nodetext_in))

if noattr <> 1:
    for i in range(len(attrname_in)):
        if (attrvalue_in[i] is not None):
            attrvalue = attrvalue_in[i].decode('UTF-8')
            newnode.set(attrname_in[i], attrvalue)

return etree.tounicode(newnode, pretty_print=True)
$body$
LANGUAGE 'plpythonu'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
0 голосов
/ 21 февраля 2013

Я только что создал функцию преобразования персонажа в символ, entity2char :

select
    xmlparse(content
        entity2char((
            xmlelement(name pampam, xmlattributes('русский' as "top"))
        )::text)
    );
        xmlparse         
-------------------------
 <pampam top="русский"/>
0 голосов
/ 23 сентября 2011

Возможно, это не лучшее решение, но оно работает для меня:

SELECT xmlparse(CONTENT '<element attribute=''áéíóú´ñÇ`''>value</element>')

Я получаю обратно:

<element attribute='áéíóú´ñÇ`'>value</element>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...