将xml转换为表postgresql 9.2时出错

时间:2014-12-08 14:20:45

标签: xml postgresql plpgsql

我有以下函数来转换用plpgsql编写的Postgresql表中的xml数据:

CREATE OR REPLACE FUNCTION inicio_actualizacion(dato xml)
 RETURNS character varying AS
$BODY$
DECLARE
    VAR TEXT;   
BEGIN
    DELETE FROM p11;
    EXECUTE 'CREATE OR REPLACE VIEW tempinicio AS 
    WITH xml_import (xml_data) AS ( 
    SELECT XMLPARSE(DOCUMENT'||quote_literal(dato)||')),otemp1 AS ( SELECT 
    UNNEST(XPATH('||quote_literal('/pl:entrada/pl:row')||', xml_data, 
    ARRAY[array['||quote_literal('pl')||', '||quote_literal('http://xxx.yy.zz/')||']])) AS vector
    FROM xml_import)
    SELECT CAST((XPATH('||quote_literal('/row/p3c1/text()')||', vector)::VARCHAR[])[1] AS integer) AS p1c1,
    XMLPARSE(CONTENT (XPATH('||quote_literal('/row/p3c3/text()')||', vector)::VARCHAR[])[1]) AS p1c2 '
    ||'FROM otemp1';
    INSERT INTO p11 SELECT * FROM tempinicio;
    RETURN '00';
END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

当我在Postgres版本9.2中使用表entrada执行此功能时:

entrada (p3c1 integer, p3c3xml)

包含以下两行:

1;"<![CDATA[<a>a123b</a>]]>"
2;"<b>c345d</b>" 

我得到以下p11的结果:

P11(p1c1 integer, p1c2 xml)
1;"&lt;a&gt;a123b&lt;/a&gt;"
2;NULL

但正确的结果应该是:

1;”<a>a123b</a>”
2;NULL

可以看出,字符<>分别被&lt;&gt;错误地替换。

1 个答案:

答案 0 :(得分:0)

您的结果符合您的预期。

您可以查找html实体&lt;

“要显示减号(<),我们必须输入:&lt;&#60;

&gt;(>)

参考https://www.w3schools.com/HTML/html_entities.asp