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

时间:2011-08-31 14:31:15

标签: 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>

结果应为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;

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

  

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

我想这与你的另一个question有关吗?​​

您不需要知道节点数,因为您不必自己显式循环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;
/

答案 1 :(得分:0)

您可以尝试使用dbms_xmldom

DECLARE
  l_doc  dbms_xmldom.DOMDocument;
  l_list dbms_xmldom.DOMNodeList;
  l_clob clob;
BEGIN
  l_doc:=dbms_xmldom.newdomdocument(form_xml);
l_list:=dbms_xmldom.getChildNodes(dbms_xmldom.getFirstChild(dbms_xmldom.MakeNode(l_doc)));
  dbms_output.put_line('length='||dbms_xmldom.getLength(l_list));
  dbms_lob.freetemporary(l_clob);
END;

根据您的Oracle版本,它可能存在包含超过64K节点的XML的问题 - 请参阅https://forums.oracle.com/forums/thread.jspa?threadID=614453