2012-02-03 54 views
1

我有這樣的XML:XML DOM。按名稱獲取元素的第一個孩子的水平

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

我想在根元素(值= 1)後的第一個孩子的水平得到元素。如果我這樣做,通過節點列表(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

隨着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) – 2012-02-05 12:49:36

+0

@AndreyKhataev:因爲'getchildrenbytagname'返回'domnodelist',因此我正在循環 - 列表中的節點數量可以是任何值。如果你真的想從列表中的第一個節點,你可以使用相同的技術比你的問題。 'getelementsbytagname'和'getchildrenbytagname'之間的區別在於第一個返回所有子元素('root/element1/doc'和'root/doc')的元素,但後者僅返回子元素('root/doc')。 – user272735 2012-02-10 13:58:43

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;