【问题标题】:PLSQL XMLTable XPath get all tags of furthest depthPLSQL XMLTable XPath 获取最远深度的所有标签
【发布时间】:2018-10-15 10:28:14
【问题描述】:

在 PL/SQL 中有没有办法获取所有最远深度的节点?

示例 1:

<responseObject>
    <response>
        <value1>A</value1>
        <value2>B</value2>
        <error>A11</error>
    <response>
<responseObject>

示例 2:

<responseObject>
    <response1>A</response1>
    <response2>B</response2>
    <response4>D</response4>
    <random>1</random>
<responseObject>

在示例 1 中,我想获取 value1、value2 和 error。在示例 2 中,我想获取 response1、response2、response4 和 random。目前我的 XPath 设置为 '/responseObject/*/*',但这不适用于第二种情况。

示例代码:

DECLARE
  lxml xmltype;
begin
  lxml := 
  xmltype('<responseObject>
              <response>
                  <value1>A</value1>
                  <value2>B</value2>
                  <error>A11</error>
              <response>
           <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;

【问题讨论】:

  • 您是否尝试过仅获取 value1 和 value2 的值而不包含任何路径?你能举一些代码示例来说明你是如何检索这些值的吗?
  • 更新问题。注意最后一个节点不一定是value1/value2。
  • 您有一个实际的 XML 示例吗?和用例?我想不出一个用例来获取最后一个属性的值。通常你想获取特定属性的值。
  • 我无法给出我正在使用的实际 XML,但我正在使用它来解析 SOAP 响应。我正在调用不同的函数并得到不同的响应,但所有响应都有我在最后一个节点中需要的值。

标签: xml oracle xpath plsql xmltable


【解决方案1】:

SQL Fiddle

Oracle 11g R2 架构设置

CREATE TABLE table_name ( id, xml ) AS
SELECT 1, '<responseObject>
    <response>
        <value1>A</value1>
        <value2>B</value2>
        <error>A11</error>
    </response>
</responseObject>' FROM DUAL UNION ALL
SELECT 2, '<responseObject>
    <response1>A</response1>
    <response2>B</response2>
    <response4>D</response4>
    <random>1</random>
</responseObject>' FROM DUAL;

查询 1

SELECT id, x.*
FROM   TABLE_NAME t
       CROSS JOIN
       xmltable(
         '/responseObject//*[last()][not(*)]'
         passing XMLType( t.xml )
         COLUMNS
           tag   VARCHAR2(128) path 'name()',
           value VARCHAR2(128) path '.'
       ) x

Results

| ID |    TAG | VALUE |
|----|--------|-------|
|  1 |  error |   A11 |
|  2 | random |     1 |

【讨论】:

  • 您好,抱歉,您的回答非常适合获得“最后一个节点”,但我的问题措辞不佳。我想得到最里面深度的所有标签。
  • @Mocking Remove [last()] - SQLFiddle
  • 效果很好!谢谢你。我尝试修改您的答案以达到我想要的结果,但我删除了 [not()]。你能解释一下 last() 和 not() 的作用吗?
  • *[*] 将匹配有子元素的元素 - *[not(*)] 将匹配没有有子元素的元素。 *[last()] 将找到的元素限制为仅最后一个元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 2014-07-30
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多