PL / SQL: подсчет количества узлов в xml - PullRequest
1 голос
/ 31 августа 2011

Я работаю с Oracle.

Есть ли способ подсчета количества узлов (включая потомков) в файле XML с использованием PL / SQL?

Я хотел бы иметь возможностьчтобы сохранить результат как переменную для использования в качестве верхнего предела для итератора цикла.

У меня есть следующий 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 ]

3 голосов
/ 01 сентября 2011

Я хотел бы иметь возможность сохранить результат как переменную для использования в качестве верхнего предела для итератора цикла.

Я думаю, это связано с вашим другим 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 голосов
/ 31 августа 2011

вы можете попробовать использовать пакет 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 могут возникнуть проблемы с XML, содержащим более 64 тыс. Узлов - см. https://forums.oracle.com/forums/thread.jspa?threadID=614453

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...