XML元素函数编码XML<>到<和>

XMLElement function Encoding XML <> to &lt; and &gt;

我想构建一些 xml,从内部 XML 开始,然后添加外部 XML。这是我的代码的简化:

DO
$$
DECLARE
  v_xml           text;
  cmd             text;
BEGIN
  cmd := 'select xmlelement(name myelement, ''test'')';
  EXECUTE cmd INTO v_xml;
  v_xml := xmlelement(name parentXMl, v_xml);
  RETURN v_xml;
END;
$$

我希望这段代码 return:

<parentxml><myelement>test</myelement></parentxml>

取而代之 returns:

<parentxml>&lt;myelement&gt;test&lt;/myelement&gt;</parentxml>

如何阻止 XMLElement() 将我的 XML 编码为 XML 值?

变量 v_xmlcmd 的类型应为 XML:

CREATE OR REPLACE FUNCTION testxml() RETURNS XML AS $$
DECLARE
  v_xml           XML;
  cmd             XML;
BEGIN
  cmd := 'select xmlelement(name myelement, ''test'')';
  EXECUTE cmd INTO v_xml;
  v_xml := xmlelement(name parentXMl, v_xml);
  RETURN v_xml;
END;
$$ LANGUAGE plpgsql;

结果是:

ds=# select testxml();                                                                                                                          testxml                       
----------------------------------------------------
 <parentxml><myelement>test</myelement></parentxml>
(1 row)

记住,元素名称应始终用引号引起来

如果您想将 xml 数据生成为文本值,请不要忘记在之后将其转换为 xml

DO
$$
DECLARE
  v_xml           text;
  cmd             text;
BEGIN
  cmd := 'select xmlelement(name "myelement", ''test'')';
  EXECUTE cmd INTO v_xml;
  v_xml := xmlelement(name "parentXMl", v_xml::xml);
  RETURN v_xml::xml;
END;
$$

Dimitry 是对的,您最好将 V_xml 声明为 xml 变量。