2012-02-03 3 views
1

에 이름 요소를 가져옵니다 :XML DOM. 나는 그런 XML을 첫 번째 자식 수준

내가 루트 요소 (값 = 1) 이후 첫 번째 자식 수준에서 요소를 얻으려면
<root> 
    <element1> 
    <doc>2</doc> 
    </element1> 
    <doc>1</doc> 
</root> 

. 내가 노드 목록을 통해 (XMLDOM API를 PL/SQL 버전)을 할 경우

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

첫 번째 요소는 값을 가진 요소가 될 것 = 내가 통해 반복하지 않고 첫 번째 자식 수준의 자식 노드를 통해서만 처리 할 수있는 방법 2 집단?

답변

2

GETCHILDRENBYTAGNAME 사용 DBMS_XMLDOM으로 :

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; 
관련 문제