2011-08-31 86 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