按标记和值将PLSQL XML转换为表

按标记和值将PLSQL XML转换为表,xml,plsql,xmltable,Xml,Plsql,Xmltable,在PL/SQL中,是否可以在不硬编码任何列的情况下将XML转换为按标记和值拆分的表 XML示例: <responseObject> <error>That is not a valid request</error> <errorCode>A11</errorCode> <value>A</value> </responseObject> 我通过硬编码错误在XMLTABLE查

在PL/SQL中,是否可以在不硬编码任何列的情况下将XML转换为按标记和值拆分的表

XML示例:

<responseObject>
    <error>That is not a valid request</error>
    <errorCode>A11</errorCode>
    <value>A</value>
</responseObject>

我通过硬编码错误在XMLTABLE查询中声明列和路径来获得特定值,但我希望动态执行此操作,因为responseObject中的标记可能会有所不同。我正在尝试将所有这些内容放入关联数组中。

我想您可能希望在Oracle 11g中使用类似的功能:

DECLARE
  lxml xmltype;
begin
  lxml := 
  xmltype('<responseObject>
             <error>That is not a valid request</error>
             <errorCode>A11</errorCode>
             <value>A</value>
           </responseObject>');

  FOR test IN (
    select tag,
           VALUE
    FROM   xmltable('responseObject/*'
             passing lxml
             columns
               tag VARCHAR2(128) path 'name()',
               VALUE VARCHAR2(128) path '.'
           ) t
  )
  LOOP
    dbms_output.put_line(test.tag || ' - ' || test.value);
  END LOOP;
end;
我基本上同意这里提供的答案:

并使用name函数检索XML节点的名称

DECLARE
  lxml xmltype;
begin
  lxml := 
  xmltype('<responseObject>
             <error>That is not a valid request</error>
             <errorCode>A11</errorCode>
             <value>A</value>
           </responseObject>');

  FOR test IN (
    select tag,
           VALUE
    FROM   xmltable('responseObject/*'
             passing lxml
             columns
               tag VARCHAR2(128) path 'name()',
               VALUE VARCHAR2(128) path '.'
           ) t
  )
  LOOP
    dbms_output.put_line(test.tag || ' - ' || test.value);
  END LOOP;
end;