我做错了什么? 我得到了一个空洞的回应。 请帮助查看下面的详细信息
下面我创建一个表并插入其中。 然后我从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
答案 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那样更改它们。