Oracle的SOAP Msg,带有名称空间extractValue()函数和XML命名空间

时间:2015-06-22 13:21:38

标签: xml oracle xpath xml-namespaces

我做错了什么? 我得到了一个空洞的回应。 请帮助查看下面的详细信息

下面我创建一个表并插入其中。 然后我从soap消息

中提取xpath详细信息的值
CREATE TABLE REQUESTS (
    ID NUMBER(10,0) PRIMARY KEY,
    REQUEST XMLTYPE,
    RESPONSE XMLTYPE
);


INSERT INTO REQUESTS (ID, REQUEST, RESPONSE)
VALUES (
    2,  
     '<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:typ="http://xmlns.oracle.com/apps/prc/po/editDocument/purchaseOrderServiceV2/types/">
   <env:Header>
      <wsa:Action>http://xmlns.oracle.com/apps/prc/po/editDocument/purchaseOrderServiceV2//PurchaseOrderService/createPurchaseOrderResponse</wsa:Action>
      <wsa:MessageID>urn:uuid:04b70bff-5a77-4e24-a7a8-e5b217aa4b4a</wsa:MessageID>
   </env:Header>
   <env:Body>
      <ns0:createPurchaseOrderResponse xmlns:ns0="http://xmlns.oracle.com/apps/prc/po/editDocument/purchaseOrderServiceV2/types/">
         <ns1:result xsi:type="ns0:RequestResults" xmlns:ns1="http://xmlns.oracle.com/apps/prc/po/editDocument/purchaseOrderServiceV2/types/" xmlns:ns0="http://xmlns.oracle.com/apps/prc/po/editDocument/purchaseOrderServiceV2/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <ns0:POHeaderId>300000000694092</ns0:POHeaderId>
            <ns0:OrderNumber>27</ns0:OrderNumber>
            <ns0:SoldToLegalEntityId>300000000639014</ns0:SoldToLegalEntityId>
            <ns0:ChangeOrderNumber xsi:nil="true"/>
            <ns0:RequestStatus>SUCCESS</ns0:RequestStatus>
         </ns1:result>
      </ns0:createPurchaseOrderResponse>
   </env:Body>
</env:Envelope>', null);




   SELECT
    req.id,
    extractValue(
        req.request, 
    '/env:Envelope/env:Body/ns0:createPurchaseOrderResponse/ns1:result/ns0:OrderNumber',
         'xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns0="http://xmlns.oracle.com/apps/prc/po/editDocument/purchaseOrderServiceV2/types/" xmlns:ns1="http://xmlns.oracle.com/apps/prc/po/editDocument/purchaseOrderServiceV2/types/"  xmlns:ns0="http://xmlns.oracle.com/apps/prc/po/editDocument/purchaseOrderServiceV2/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ') Title
FROM 
    requests req
WHERE
    id = 2

1 个答案:

答案 0 :(得分:0)

查看extractValue()的最后一个参数,它指定了名称空间前缀声明:

'xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns0="http://xmlns.oracle.com/apps/prc/po/editDocument/purchaseOrderServiceV2/types/"
xmlns:ns1="http://xmlns.oracle.com/apps/prc/po/editDocument/purchaseOrderServiceV2/types/" 
xmlns:ns0="http://xmlns.oracle.com/apps/prc/po/editDocument/purchaseOrderServiceV2/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" '

(为了易读性添加了换行符。)

名称空间前缀ns0被声明两次,有两个不同的名称空间URI值...其中一个与ns1共享!这遵循XML中的用法(这是可以理解但不是必需的),并且在评估XPath表达式时,确保ns0的哪个定义实际上有效(或者不可能?)。

要解决此问题,请删除第一个ns0声明,因为".../types"名称空间已被ns1覆盖。然后将XPath表达式更改为

'/env:Envelope/env:Body/ns1:createPurchaseOrderResponse/ns1:result/ns0:OrderNumber'

如果您知道名称空间声明如何工作,则可以按照XML查看为什么这将解决问题。如果不是,那么值得学习,如果您使用的是使用命名空间的XML词汇表,比如SOAP。尝试其中之一:

您是否可以控制XML及其序列化方式?它没有任何技术上的错误,但命名空间前缀声明的选择似乎几乎被设计为导致人为错误。如果您对它有任何控制权,则应选择助记符前缀并始终如一地使用它们,而不是像当前XML那样更改它们。