【问题标题】:Delete xml node with a specific CDATA删除具有特定 CDATA 的 xml 节点
【发布时间】:2020-09-17 22:50:05
【问题描述】:

这是我的 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>

我需要使用 Oracle 跨表删除带有&lt;![CDATA[0001FFFFFFFF]]&gt; 的 EO 节点。此 xml 存储在 XMLTYPE 的 XM_DATA_CACHE 中。 有没有办法基于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>  ```

【问题讨论】:

    标签: sql xml database oracle cdata


    【解决方案1】:

    首先你的xml被破坏了:第二个标签GoalMeasurementEORow没有关闭,而且因为它只是xml的一部分,它没有根标签。

    无论如何,我已经修复了您的 xml,以展示如何从您的 xml 中删除 cdata

    请看下面的例子:

    -- 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 消失。

    【讨论】:

    • 对不起,我的问题不清楚。我不想删除 CDATA。我想删除 CDATA=0001FFFFFFFF 的记录,然后将 xml 更新回 clob 列。 Clob 列 data_cache 有 2 条记录,如上。我想使用 CDATA 值删除第一条记录,然后将新的 xml 更新回 clob 列。
    • @TChalla 啊,好吧,这更容易了,看看这个:gist.github.com/xtender/c1ba1d987d062fed2d661a9fab0ead2d
    • 嗨,它似乎无法正常工作。我仍然在结果中看到节点 GoalMeasurementEO"&gt; &lt;![CDATA[0001FFFFFFFF]]&gt;
    • @TChalla 啊,抱歉,复制粘贴错误。请看正确的:gist.github.com/xtender/c1ba1d987d062fed2d661a9fab0ead2d
    • 非常感谢Sayan。这很有帮助!!
    猜你喜欢
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多