从XMLTYPE读取元素
希望有人能帮忙 在PLSQL中,我执行一个soap调用,并从soap接收XML结果。 我需要检索一个元素值 这在这个XML上工作得很好:从XMLTYPE读取元素,xml,soap,oracle12c,Xml,Soap,Oracle12c,希望有人能帮忙 在PLSQL中,我执行一个soap调用,并从soap接收XML结果。 我需要检索一个元素值 这在这个XML上工作得很好: <?xml version="1.0" encoding="UTF-8"?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:executeObjectResponse xmlns:ns2="
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:executeObjectResponse xmlns:ns2="http://www.uc4.com/uc4/">
<runID>1120864</runID>
</ns2:executeObjectResponse>
</S:Body>
</S:Envelope>
但是,我确实对以下XML有问题。
我需要检索此标记的值:
<name>&RESULT#</name>
欢迎所有建议
干杯
Wim我发现代码是有效的
dbms_xmldom.freeDocument(v_doc);
v_doc := DBMS_XMLDOM.newdomdocument (l_result);
v_nodelist := DBMS_XMLDOM.getelementsbytagname (v_doc, 'name');
v_node := DBMS_XMLDOM.getfirstchild (DBMS_XMLDOM.item (v_nodelist, 19));
v_value := DBMS_XMLDOM.getnodevalue (v_node);
DBMS_OUTPUT.put_line ('name: ' || v_Value);
v_nodelist := DBMS_XMLDOM.getelementsbytagname (v_doc, 'value');
v_node := DBMS_XMLDOM.getfirstchild (DBMS_XMLDOM.item (v_nodelist, 17));
v_value := DBMS_XMLDOM.getnodevalue (v_node);
DBMS_OUTPUT.put_line ('value : ' || v_Value);
结果是:
name: &RESULT#
value : /dev;/u01;/etc/mnttab;/etc/dfs/sharetab;/dev/fd;/export;/rpool;/mnt/ora_dba
我仍然试图找到的是如何搜索元素&RESULT#以及属于该元素的值。
现在我确实计算了元素(19表示名称,17表示值),只是为了检查代码
干杯Wim我根本不会尝试遍历DOM,尽管我认为您可以迭代
项
节点,测试每个节点中的名称
文本,并在找到感兴趣的文本时停止,然后使用该项
节点的值
文本
不过,使用内置的XML处理更容易:
declare
l_result clob := '... your SOAP response ...';
v_Value VARCHAR2 (2000);
begin
select xmlquery('//items/name[text()=''&RESULT#'']/../value/text()'
passing xmltype(l_result)
returning content).getstringval()
into v_Value
from dual;
DBMS_OUTPUT.put_line ('value: ' || v_Value);
end;
/
value: /dev;/u01;/etc/mnttab;/etc/dfs/sharetab;/dev/fd;/export;/rpool;/mnt/ora_dba
PL/SQL procedure successfully completed.
你可以。在本例中,我使用了XPath:
//items/name[text()=''&RESULT#'']/../value/text()
查找文本值为所需字符串的items/name
节点(在转义单引号中);然后使用。
查找它的父节点(项
),然后在该项
节点下查找值
节点。并获取其文本值
(最好给出/items
节点的完整路径,并包含所有名称空间信息,但您可以将其添加到中;使用//items
会忽略上面的结构)
顺便说一句,您也可以对第一个示例执行相同的操作:
...
begin
select xmlquery('//runID/text()'
passing xmltype(l_result)
returning content).getstringval()
into v_Value
from dual;
DBMS_OUTPUT.put_line ('value a: ' || v_Value);
end;
/
value a: 1120864
PL/SQL procedure successfully completed.
&;结果#
是节点文本值,而不是节点名称。你到底想得到什么?您引用的name
节点的值是您正在查找的字符串,因此您已经有了该字符串。。。。因此,您需要该名称
节点的匹配值
节点?Thx Alex,我正在查找元素名称后面的值和该值。见下文。。这应该是对你的问题的编辑,而不是回答。嗨,Alex,根本不知道如何从XML开始,所以谷歌搜索了一些代码。然而,你的方法确实不那么简单。谢谢你的帮助。。我会用这个。很好;)干杯
declare
l_result clob := '... your SOAP response ...';
v_Value VARCHAR2 (2000);
begin
select xmlquery('//items/name[text()=''&RESULT#'']/../value/text()'
passing xmltype(l_result)
returning content).getstringval()
into v_Value
from dual;
DBMS_OUTPUT.put_line ('value: ' || v_Value);
end;
/
value: /dev;/u01;/etc/mnttab;/etc/dfs/sharetab;/dev/fd;/export;/rpool;/mnt/ora_dba
PL/SQL procedure successfully completed.
//items/name[text()=''&RESULT#'']/../value/text()
...
begin
select xmlquery('//runID/text()'
passing xmltype(l_result)
returning content).getstringval()
into v_Value
from dual;
DBMS_OUTPUT.put_line ('value a: ' || v_Value);
end;
/
value a: 1120864
PL/SQL procedure successfully completed.