PL/SQL:计算 xml 中的节点数

quo*_*ame 2 xml plsql count nodes

我正在与 Oracle 合作。

有没有办法使用 PL/SQL 计算 XML 文件中的节点(包括后代)的数量?

我希望能够将结果保存为变量以用作循环迭代器的上限。

我有以下xml,我想计算行节点内的节点数:

<row>
  <date name="date1" id="101"></date>
  <element1 name="ele1" id="111">
    <stuff></stuff>
    <stuff></stuff>
    <stuff></stuff>
  </element1>
  <element2 name="ele2" id="121"></element2>
  <element3 name="ele3" id="131></element15>
</row>
Run Code Online (Sandbox Code Playgroud)

结果应该是 7。

@johnbk 我正在与 Oracle 合作

这里的想法是,在获得节点数后,我可以将其用于:

nodeCount := 1;
    FOR i IN 1 .. numNodes
    LOOP
        xpath1 := '/row/*[' || nodeCount || ']/@name';
        SELECT EXTRACT(form_xml, xpath1) as other_name;
        nodeCount := nodeCount +1;
    END LOOP;
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助。

use*_*735 6

我希望能够将结果保存为变量以用作循环迭代器的上限。

我想这与您的另一个问题有关

您不需要知道节点数,因为您不必自己显式循环 xml。您可能正试图以次优的方式解决您的实际问题。

下面是如何使用XMLQUERY找到您要查找的号码的方法:

declare
  v_data constant xmltype := xmltype('<row>
  <date name="date1" id="101"></date>
  <element1 name="ele1" id="111">
    <stuff></stuff>
    <stuff></stuff>
    <stuff></stuff>
  </element1>
  <element2 name="ele2" id="121"></element2>
  <element3 name="ele3" id="131"></element3>
  </row>');
  v_count xmltype;
begin
  select xmlquery('count($doc/row/descendant::*)'
          passing v_data as "doc"
          returning content)
    into v_count from dual;
  dbms_output.put_line('count = ' || v_count.getstringval);
end;
/
Run Code Online (Sandbox Code Playgroud)