我正在尝试解析以下SOAP响应:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<TestFunctionResponse xmlns="http://tempuri.org/">
<TestFunctionResult>Verarbeitet: test</TestFunctionResult>
</TestFunctionResponse>
</s:Body>
</s:Envelope>
为此,我运行一个PL / SQL函数:
l_value_xml := apex_web_service.parse_xml( p_xml => l_soap_response,
p_xpath => '/TestFunctionResult/text()',
p_ns => 'xmlns="http://tempuri.org/"'
);
它没有给我任何回应。我在xpath在线测试程序中尝试了xpath。也没有回应。我认为这是一个错误的命名空间,但我找不到错误。
答案 0 :(得分:2)
(免责声明:我不熟悉pl / sql,只有XPath)
命名空间URI是正确的,但是您的原始XPath表达式:
p_xpath => '/TestFunctionResult/text()'
尝试查找SOAP响应中不存在的内容。它查找类似于:
的XML文档<TestFunctionResult>Verarbeitet: test</TestFunctionResult>
其中TestFunctionResult
元素是最外层的元素。在您的实际文档中,情况并非如此。
使用//
(descendant-or-self::
)轴:
p_xpath => '//TestFunctionResult/text()'
或者,更好的是,键入这样的层次结构:
p_xpath => '/Envelope/Body/TestFunctionResponse/TestFunctionResult/text()'
另一个潜在的错误来源可能是您在PL / SQL代码中声明了一个默认命名空间,但该命名空间不会自动与路径表达式中的元素相关联。
在具有XPath功能的编程语言中,使用前缀注册或声明名称空间更为常见:
xmlns:soap="http://tempuri.org/"
然后在路径表达式中为属于该命名空间的所有元素添加前缀:
p_xpath => '//soap:TestFunctionResult/text()'