从CLOB XML列中提取值

时间:2019-03-07 12:53:58

标签: xml oracle xpath

我有一个表,其中的一列是具有XML格式数据的CLOB类型。

在下面的示例中,我试图提取CreatedByUserID的值是7934665。

我尝试使用XPATH和Oracle中的extractvalue函数来执行此操作,但是由于某种原因,我没有得到结果。

以下列方式之一尝试过。 xmltype(Column_Name).extract('// EventPayloadDetails / ns3:PayloadDetailsList / ns3:PayloadDetail / ns3:key / text()')。getStringVal()

它显示LPX-00601:无效的令牌。请对此提供帮助。

列值

<EventPayloadDetails 
  xmlns:bpmn="http://schemas.oracle.com/bpm/xpath" 
  xmlns:ns3="urn:qi.com/EventPayloadDetails"  
  xmlns="urn:qi.com/EventPayloadDetails">
    <ns3:PayloadDetailsList>
        <ns3:PayloadDetail>
            <ns3:key>NUMBER</ns3:key>
            <ns3:value>0014</ns3:value>
        </ns3:PayloadDetail>
        <ns3:PayloadDetail>
            <ns3:key>Dep Num</ns3:key>
            <ns3:value>120</ns3:value>
        </ns3:PayloadDetail>
        <ns3:PayloadDetail>
            <ns3:key>CreatedByUserID</ns3:key>
            <ns3:value>7934665</ns3:value>
        </ns3:PayloadDetail>
        <ns3:PayloadDetail>
            <ns3:key>CreatedByFirstName</ns3:key>
            <ns3:value>M</ns3:value>
        </ns3:PayloadDetail>
        <ns3:PayloadDetail>
            <ns3:key>CreatedByLastName</ns3:key>
            <ns3:value>Ash</ns3:value>
        </ns3:PayloadDetail>
        <ns3:PayloadDetail>
            <ns3:key>Comments</ns3:key>
            <ns3:value>"Review after this 
query"
</ns3:value>
        </ns3:PayloadDetail>
    </ns3:PayloadDetailsList>
</EventPayloadDetails>

2 个答案:

答案 0 :(得分:2)

请尝试以下XPath:

//EventPayloadDetails/ns3:PayloadDetailsList/ns3:PayloadDetail[ns3:key='CreatedByUserID']/ns3:value/text()

答案 1 :(得分:2)

创建了一个查询,该查询接收XML(在WITH部分中)并执行提取(滚动到末尾)。

WITH test_table
  AS (SELECT TO_CLOB('<EventPayloadDetails 
     xmlns:bpmn="http://schemas.oracle.com/bpm/xpath" 
     xmlns:ns3="urn:qi.com/EventPayloadDetails"  
     xmlns="urn:qi.com/EventPayloadDetails">
       <ns3:PayloadDetailsList>
           <ns3:PayloadDetail>
               <ns3:key>NUMBER</ns3:key>
               <ns3:value>0014</ns3:value>
           </ns3:PayloadDetail>
           <ns3:PayloadDetail>
               <ns3:key>Dep Num</ns3:key>
               <ns3:value>120</ns3:value>
           </ns3:PayloadDetail>
           <ns3:PayloadDetail>
               <ns3:key>CreatedByUserID</ns3:key>
               <ns3:value>7934665</ns3:value>
           </ns3:PayloadDetail>
           <ns3:PayloadDetail>
               <ns3:key>CreatedByFirstName</ns3:key>
               <ns3:value>M</ns3:value>
           </ns3:PayloadDetail>
           <ns3:PayloadDetail>
               <ns3:key>CreatedByLastName</ns3:key>
               <ns3:value>Ash</ns3:value>
           </ns3:PayloadDetail>
           <ns3:PayloadDetail>
               <ns3:key>Comments</ns3:key>
               <ns3:value>"Review after this 
   query"
   </ns3:value>
           </ns3:PayloadDetail>
       </ns3:PayloadDetailsList>
   </EventPayloadDetails>') as test_data
   from dual)
SELECT XMLTYPE(test_data) xml_data
     , EXTRACTVALUE(
          XMLTYPE(test_data)
         ,'//*/ns3:PayloadDetailsList/ns3:PayloadDetail[ns3:key="CreatedByUserID"]/ns3:value'
         ,'xmlns:ns3="urn:qi.com/EventPayloadDetails"'
       ) value
     , XMLTYPE(test_data).extract(
                             '//*/ns3:PayloadDetailsList/ns3:PayloadDetail[ns3:key="CreatedByUserID"]/ns3:value/text()'
                            ,'xmlns:ns3="urn:qi.com/EventPayloadDetails"'
                          ).getStringVal() value2
  FROM test_table