Plsql xmldom。在第一个子级别上按名称获取元素

Plsql xmldom。在第一个子级别上按名称获取元素,plsql,xmldom,Plsql,Xmldom,我有这样的xml: <root> <element1> <doc>2</doc> </element1> <doc>1</doc> </root> 列表中的第一个元素是值为2的元素。如何仅通过第一个子级的子节点处理而不通过元素循环?使用: 您可以使用xslprocessor包,然后使用XPath查找正确的节点: nl := xslprocessor.selectnodes(ro

我有这样的xml:

<root>
  <element1>
     <doc>2</doc>
  </element1>
  <doc>1</doc>
</root>
列表中的第一个元素是值为2的元素。如何仅通过第一个子级的子节点处理而不通过元素循环?

使用:


您可以使用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;

我看到您在使用循环,这是我要求避免的。但我不明白,为什么在第一次迭代(I=0)时会得到结果@AndreyKhataev:我之所以循环,是因为
getchildrenbytagname
返回
domnodelist
-列表中的节点数可以是任何值。如果你真的想要列表中的第一个节点,你可以使用与你的问题相同的技巧。
getelementsbytagname
getchildrenbytagname
之间的区别在于,前者返回所有子级(
root/element1/doc
root/doc
)上的元素,而后者只返回子元素(
root/doc
)。
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>
nl := xslprocessor.selectnodes(rootnode, 'root/doc');
len := xmldom.getLength(nl);
IF LEN>0 THEN
    N:=xmldom.item(nl, 0);
END IF;
RETURN N;