2011-08-31 84 views
1

我正在使用Oracle。PL/SQL:计算xml中的节点数

有没有办法使用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; 

感谢您的帮助。

+0

的数据库,你的工作吗? –

+0

@johnbk我正在使用Oracle – quotemyname

回答

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; 
/
+0

只是好奇,所以我可以更好地理解语言,如果我必须查询以获取v_data并且无法'声明'它,你会怎么做?它来自一个查询,从数据库中获取信息。你会选择table.data INTO v_data吗? – quotemyname

+0

@quotemyname:这是一个选项,但您也可以直接从数据库表中获取XML数据。这会从表'so11t'列'xmldata'获得XML数据,其中'so11t.id = 1':select xmlquery('count($ doc/row/descendant :: *)'将t.xmldata作为“doc”返回内容) 从so11t t到v_count其中id = 1;' – user272735

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