Postgres xmlelement编码

时间:2011-09-22 07:20:45

标签: xml postgresql encoding utf-8 internationalization

我的UTF-8的postgres数据库和UTF-8的客户端。
当我尝试:

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

我回来了:

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

但我希望恢复属性(即俄语UTF-8),而不是&#x440 .... 我怎么能这样做?


这不是解决问题,我使用xmleliment从数据构造xml通过查询获取。 我找不到另一种方法来做到这一点......

4 个答案:

答案 0 :(得分:1)

这似乎不可能。要打印的值传递给libxml,这就是它选择打印它的方式。

答案 1 :(得分:0)

可能这不是最佳解决方案,但这对我有用:

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

我回来了:

<element attribute='áéíóú´ñÇ`'>value</element>

答案 2 :(得分:0)

我刚刚创建了一个字符实体到字符转换函数entity2char

select
    xmlparse(content
        entity2char((
            xmlelement(name pampam, xmlattributes('русский' as "top"))
        )::text)
    );
        xmlparse         
-------------------------
 <pampam top="русский"/>

答案 3 :(得分:0)

我使用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;