Удалить узел xml с определенным CDATA

#sql #xml #database #oracle #cdata

#sql #xml #База данных #Oracle #cdata

Вопрос:

Это часть моего XML:

  <EO Name="oracle.apps.hcm.goals.core.publicModel.entity.GoalMeasurementEO">    
                    <![CDATA[0001FFFFFFFF]]>    
                    <GoalMeasurementEORow PS="0" Hdl="16" PK="Y" CI="Y" AV="111111111111111111111111111111">    
                       <MeasurementId>  
                          <DATA null="true"/>   
                       </MeasurementId> 
                    </GoalMeasurementEORow> 
                 </EO>  
    <EO Name="oracle.apps.hcm.goals.core.publicModel.entity.GoalMeasurementEO"> 
                    <![CDATA[00010000000EACED00057708000110D943311B2F]]>    
                    <GoalMeasurementEORow PS="0" Hdl="1019" PK="Y" CI="Y" AV="">    
                       <MeasurementId>  
                          <DATA>300000297949999</DATA>  
                       </MeasurementId> 
                       <BusinessGroupId>    
                          <DATA>1</DATA>    
                       </BusinessGroupId>   
                     </EO>
  

Мне нужно удалить узел EO с <![CDATA[0001FFFFFFFF]]> помощью, через таблицу, используя Oracle. Этот XML хранится в XM_DATA_CACHE XMLTYPE.
Есть ли способ удаления на основе CDATA

Конечный результат должен быть

 <EO Name="oracle.apps.hcm.goals.core.publicModel.entity.GoalMeasurementEO"> 
                    <![CDATA[0001FFFFFFFF]]>    
                    <GoalMeasurementEORow PS="0" Hdl="16" PK="Y" CI="Y" AV="111111111111111111111111111111">    
                       <MeasurementId>  
                          <DATA null="true"/>   
                       </MeasurementId> 
                    </GoalMeasurementEORow> 
                 </EO>  ```
  

Ответ №1:

Прежде всего, ваш xml поврежден: второй тег GoalMeasurementEORow не закрыт, а также, поскольку это всего лишь часть xml, у него нет корневого тега.

В любом случае, я исправил ваш xml, чтобы показать, как вы можете удалить cdata его из своего xml.

Пожалуйста, посмотрите на следующий пример:

 -- sample data:
with t(x) as (
select xmltype(q'{
<ROOT>
<EO Name="oracle.apps.hcm.goals.core.publicModel.entity.GoalMeasurementEO">    
                    <![CDATA[0001FFFFFFFF]]>    
                    <GoalMeasurementEORow PS="0" Hdl="16" PK="Y" CI="Y" AV="111111111111111111111111111111">    
                       <MeasurementId>  
                          <DATA null="true"/>   
                       </MeasurementId> 
                    </GoalMeasurementEORow> 
                 </EO>  
    <EO Name="oracle.apps.hcm.goals.core.publicModel.entity.GoalMeasurementEO"> 
                    <![CDATA[00010000000EACED00057708000110D943311B2F]]>    
                    <GoalMeasurementEORow PS="0" Hdl="1019" PK="Y" CI="Y" AV="">    
                       <MeasurementId>  
                          <DATA>300000297949999</DATA>  
                       </MeasurementId> 
                       <BusinessGroupId>    
                          <DATA>1</DATA>    
                       </BusinessGroupId>
                       </GoalMeasurementEORow>
                     </EO>
</ROOT>
}')
from dual)-- end of sample data
-- main query:
select
  XMLQuery(
        'copy $i := $p1 modify
            (for $j in $i//EO
              let $o := <EO >{$j/@*}{ $j/node()[name() ne ""]}</EO>
                return replace node $j with $o
                )
        return $i' 
        PASSING t.x AS "p1"
        returning content
        ) xdata_new
from t;
  

Результаты:

 XDATA_NEW
----------------------------------------------------------------------------------
<ROOT>
  <EO Name="oracle.apps.hcm.goals.core.publicModel.entity.GoalMeasurementEO">
    <GoalMeasurementEORow PS="0" Hdl="16" PK="Y" CI="Y" AV="111111111111111111111111111111">
      <MeasurementId>
        <DATA null="true"/>
      </MeasurementId>
    </GoalMeasurementEORow>
  </EO>
  <EO Name="oracle.apps.hcm.goals.core.publicModel.entity.GoalMeasurementEO">
    <GoalMeasurementEORow PS="0" Hdl="1019" PK="Y" CI="Y" AV="">
      <MeasurementId>
        <DATA>300000297949999</DATA>
      </MeasurementId>
      <BusinessGroupId>
        <DATA>1</DATA>
      </BusinessGroupId>
    </GoalMeasurementEORow>
  </EO>
</ROOT>
  

Как вы можете видеть, я заменяю все дочерние узлы EO их содержимым, и CDATA исчезает.

Комментарии:

1. Извините, мой вопрос не был ясен. Я не хочу удалять CDATA. Я хочу удалить запись, которая имеет CDATA= 0001FFFFFFFF, а затем обновить xml обратно в столбец clob. Столбец Clob data_cache содержит 2 записи, как указано выше. Я хочу удалить первую запись, используя значение CDATA, а затем обновить новый xml обратно в столбец clob.

2. @TChalla ах, хорошо, это намного проще, посмотрите на это: gist.github.com/xtender/c1ba1d987d062fed2d661a9fab0ead2d

3. Привет, похоже, он работает неправильно. Я все еще вижу узел GoalMeasurementEO"> <![CDATA[0001FFFFFFFF]]> в результатах

4. @TChalla ах, извините, ошибка копирования-вставки. Пожалуйста, посмотрите на правильный: gist.github.com/xtender/c1ba1d987d062fed2d661a9fab0ead2d

5. Большое спасибо, Саян. Это было очень полезно !!