我想从内部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;
$$
我希望这段代码能够返回:
<parentxml><myelement>test</myelement></parentxml>
相反,它返回:
<parentxml><myelement>test</myelement></parentxml>
如何阻止XMLElement()将我的XML编码为XML值?
答案 0 :(得分:2)
变量类型v_xml
,cmd
应为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)
答案 1 :(得分:1)
请记住,元素名称应始终引用
如果要将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变量。