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