【问题标题】:Postgres xmlelement encodingPostgres xmlelement编码
【发布时间】:2011-11-22 14:04:06
【问题描述】:

我的 UTF-8 格式的 postgres 数据库和 UTF-8 格式的客户端也是如此。
当我尝试:

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

我回来了:

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

但我想按原样返回属性(即俄语 UTF-8),而不是 &amp;#x440....
我该怎么做?


这不是解决问题,我使用 xmleliment 从查询返回的数据中构造 xml。 而且我找不到其他方法来做到这一点......

【问题讨论】:

    标签: xml postgresql encoding utf-8 internationalization


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      我回来了:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2013-06-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-07-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-05
            相关资源
            最近更新 更多