2012-02-03 3 views
1

У меня есть такой XML:XML DOM. Получить элемент по имени на первом уровне ребенка

<root> 
    <element1> 
    <doc>2</doc> 
    </element1> 
    <doc>1</doc> 
</root> 

Я хочу, чтобы получить элемент на первом уровне ребенка после корневого элемента (значение = 1). Если я делаю это через нодлисте (PL/SQL версии из XMLDOM API):

nl := getElementsByTagName(rootnode,'doc'); 
len := xmldom.getLength(nl); 
IF LEN>0 THEN 
    N:=xmldom.item(nl, 0); 
END IF; 
RETURN N; 

первый элемент в списке будет элемент со значением = 2. Как я мог обрабатывать только через дочерние узлы первого уровня ребенка без зацикливания через элементы?

ответ

2

С DBMS_XMLDOM использование GETCHILDRENBYTAGNAME:

declare 
    xml constant xmltype := xmltype(
'<root> 
    <element1> 
    <doc>2 - two</doc> 
    </element1> 
    <doc>1 - one</doc> 
</root>' 
); 
    doc constant dbms_xmldom.domdocument := dbms_xmldom.newdomdocument(xml); 

    root_elem constant dbms_xmldom.domelement := 
    dbms_xmldom.getdocumentelement(doc); 

    doc_nodes constant dbms_xmldom.domnodelist := 
    dbms_xmldom.getchildrenbytagname(root_elem, 'doc'); 
begin 
    declare 
    last_index constant pls_integer := dbms_xmldom.getlength(doc_nodes) - 1; 
    node dbms_xmldom.domnode; 
    text_node dbms_xmldom.domnode; 
    begin 
    for i in 0 .. last_index loop 
     node := dbms_xmldom.item(doc_nodes, i); 
     text_node := dbms_xmldom.getfirstchild(node); 
     dbms_output.put_line('i = ' || i || 
          ' name = ' || dbms_xmldom.getnodename(node) || 
          ' type = ' || dbms_xmldom.getnodetype(node) || 
          ' text = ' || dbms_xmldom.getnodevalue(text_node)); 
    end loop; 
    end; 
end; 
/

Выход:

SQL> @so24 
i = 0 name = doc type = 1 text = 1 - one 

PL/SQL procedure successfully completed. 

SQL> 
+0

Я вижу тебя используя LOOP, который я попросил избежать. Но я не могу понять, почему вы получаете результат на первой итерации (i = 0) –

+0

@AndreyKhataev: Я зацикливаюсь, потому что 'getchildrenbytagname' возвращает' domnodelist' - количество узлов в списке может быть чем угодно. Если вам действительно нужен только первый узел из списка, вы можете использовать ту же технику, что и в своем вопросе. Разница между 'getelementsbytagname' и' getchildrenbytagname' заключается в том, что первый возвращает элементы на всех подуровнях ('root/element1/doc' и' root/doc'), но последний возвращает только дочерние элементы ('root/doc'). – user272735

0

Вы можете использовать пакет xslprocessor, а затем найти правильный узел с помощью XPath:

nl := xslprocessor.selectnodes(rootnode, 'root/doc'); 
len := xmldom.getLength(nl); 
IF LEN>0 THEN 
    N:=xmldom.item(nl, 0); 
END IF; 
RETURN N; 
Смежные вопросы