如何在Oracle中通过xmltype解析XML

时间:2016-03-02 09:15:11

标签: xml oracle plsql xml-parsing xmltable

当我尝试解析XML文档时,我在XPath属性方面遇到了一些问题。 这是我的例子:

org.apache.thrift.server.TNonblockingServer$SelectAcceptThread.run() 456

我收到了NO_DATA_FOUND异常,因为我无法在此解析方法中找到结果。

我尝试了很多不同的策略,包括将 TTransportFactory tTransportFactory = new TFramedTransport.Factory(); TNonblockingServerTransport tNonblockingServerTransport = new TNonblockingServerSocket(7911); PersistenceService.AsyncProcessor<?> processor = getAsyncProcessor(serviceName); Factory protocolFactory = new TBinaryProtocol.Factory(true, true); THsHaServer.Args serverArgs = new THsHaServer.Args(tNonblockingServerTransport); serverArgs.processor(processor); serverArgs.transportFactory(tTransportFactory); serverArgs.protocolFactory(protocolFactory); TNonblockingServer tNonblockingServer = new THsHaServer(serverArgs); System.out.println("Starting persistence server on port 7911 ..."); tNonblockingServer.serve(); 放在PATH或XQUery字符串中,但没有成功。

我认为这是一个小而简单的问题,但我无法找到。 提前致谢! 菲利普

1 个答案:

答案 0 :(得分:1)

您在urn:命名空间声明中缺少ns1前缀。您也忽略了<return>节点级别,并且您有一个默认命名空间,因为您有没有任何命名空间的子节点,这是不正确的。所以你需要:

   SELECT Return.msgType
     INTO lv_msgType
     FROM XMLTABLE (
             xmlnamespaces (
                'http://schemas.xmlsoap.org/soap/envelope/' AS "soapenv",
                'http://schemas.xmlsoap.org/soap/envelope/' AS "SOAP",
                'urn:enterprise.com/ws/SAP/Finantial/MaintainMandate/V1' AS "ns1"),
             '/soapenv:Envelope/SOAP:Body/ns1:maintainMandateResponse'
             PASSING px_return
             COLUMNS msgType VARCHAR2 (1) PATH 'return/messageType') Return;

获得:

PL/SQL procedure successfully completed.

Message type: E

或者您也可以将返回值移动到XPath中,这在此处具有相同的效果:

             '/soapenv:Envelope/SOAP:Body/ns1:maintainMandateResponse/return'
             PASSING px_return
             COLUMNS msgType VARCHAR2 (1) PATH 'messageType') Return;