XPATH没有给出结果。错误的命名空间?

时间:2014-12-12 10:37:10

标签: xml soap xpath plsql oracle-apex

我正在尝试解析以下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。也没有回应。我认为这是一个错误的命名空间,但我找不到错误。

1 个答案:

答案 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()'