我正在与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;
感谢您的帮助。
答案 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