我的UTF-8的postgres数据库和UTF-8的客户端。
当我尝试:
select xmlelement(name pampam, xmlattributes('русский' as "top"));
我回来了:
<pampam top="русский"/>`
但我希望恢复属性(即俄语UTF-8),而不是р
....
我怎么能这样做?
这不是解决问题,我使用xmleliment从数据构造xml通过查询获取。 我找不到另一种方法来做到这一点......
答案 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;