我很难理解我看到的其他问题,因为它们有些不同。
我从Web服务vi UTL_HTTP获取XML作为响应。XML具有重复的子节点,我只想提取1个特定值。
响应XML:
<Customer> <Loyalty> <Client> <Identifications> <Identification> <Form>Form1</Form> <value>1234</value> </Identification> <Identification> <Form>Form2</Form> <value>4442</value> </Identification> <Identification> <Form>Form3</Form> <value>9995</value> </Identification> </Identifications> </Client> </Loyalty> </Customer>
我只需要<value>在node <Form>=“ Form3”的位置提取节点。
<value>
<Form>
因此,在我的代码中,我收到了另一个函数的响应
v_ds_xml_response XMLTYPE; -- Here would lie the rest of the code (omitted) preparing the XML and next calling the function with it: V_DS_XML_RESPONSE := FUNCTION_CALL_WEBSERVICE( P_URL => V_DS_URL, --endpoint P_DS_XML => V_DS_XML, --the request XML P_ERROR => P_ERROR);
这样,我创建了一个LOOP来存储值。我尝试使用WHERE甚至创建类型(下面的V_IDENTIFICATION是该类型),但是它没有返回任何内容(空)。
for r IN ( SELECT ExtractValue(Value(p),'/Customer/Loyalty/Client/Identifications/Identification/*[local-name()="Form"]/text()') as form, ExtractValue(Value(p),'/Customer/Loyalty/Client/Identifications/Identification/*[local-name()="value"]/text()') as value FROM TABLE(XMLSequence(Extract(V_DS_XML_RESPONSE,'//*[local-name()="Customer"]'))) p LOOP V_IDENTIFICATION.FORM := r.form; V_IDENTIFICATION.VALUE := r.value; END LOOP; SELECT V_IDENTIFICATION.VALUE INTO P_LOYALTY_VALUE FROM dual WHERE V_IDENTIFICATION.TIPO = 'Form3';
注意,P_LOYALTY_VALUE是我的过程中的OUT参数
我设法找到了一个非常简单的解决方案,只是添加了[text()=“ Form3”] /…/“来声明Xpath,如下所示
SELECT ExtractValue(Value(p),'/Customer/Loyalty/Client/Identifications/Identification/*[local-name()="Form"][text()="Form3"]/text()') as form, ExtractValue(Value(p),'/Customer/Loyalty/Client/Identifications/Identification/Form[text()="Form3"]/.../*[local-name()="value"]/text()') as value
还提取值,然后将它们直接发送到过程的OUT参数中:
P_FORM := r.form; P_LOYALTY_VALUE := r.value;