【问题标题】:How can I get rid of unwanted empty XML tags?如何摆脱不需要的空 XML 标记?
【发布时间】:2016-07-20 07:15:38
【问题描述】:

在下面的 SQL XML 中,如果所有这些字段都为空,我不想显示 recordingInfo 标记:

cc.source_album_title
cc.product_album_promo_title
cc.label
cc.catalogue_no
cc.isrc

这是我当前的查询:

 SELECT XMLAGG(XMLElement("Cue"  -- start level 5 tag for cue                                            
                             ,XMLFOREST( rownum as "cueId"    
                             ,cc.dn_ccst_status as "cueStatusType"                                        
                             ,decode(cc.dn_ccst_status,'5',cc.cup_code,NULL) as  "cueCupType" )                                                                                 
                                ,XMLElement("musicWork"  -- start level 6 tag for music title   
                                        ,XMLFOREST(cc.title as "musicTitle") 
                                        ,XMLElement("recordingInfo"  -- start level 7 tag for music title
                                                ,XMLFOREST( cc.source_album_title as "albumTitle"    
                                                            ,cc.product_album_promo_title as "promoTitle"                                        
                                                            ,cc.label as  "label"    
                                                            ,cc.catalogue_no as "catalogNumber"    
                                                            ,cc.isrc as "isrc")                                                                                   
                                                    )     

                                          )  -- end level 6 tag for music title   

                 )  -- end level 5 tag cue
              )
FROM creation_components cc
WHERE cc.prod_cre_surr_id = 22736214

如果上面列出的列全部为空,这将生成带有空 recordingInfo 标记的 XML:

<Cue>
   <cueId>1</cueId>
   <cueStatusType>5</cueStatusType>
   <cueCupType>W</cueCupType>
   <musicWork>
       <musicTitle>CLARE@RADIOWORKS.CO.UK</musicTitle>
       <recordingInfo></recordingInfo>
   </musicWork>
</Cue>

如果其中没有生成其他元素,如何阻止它包括空的recordingInfo 标记?

【问题讨论】:

    标签: sql xml oracle


    【解决方案1】:

    您可以使用嵌套的XMLForest(.. as "recordingInfo") 调用而不是XMLElement("recordingInfo")

    SELECT XMLAGG(XMLElement("Cue"  -- start level 5 tag for cue
      ,XMLFOREST( rownum as "cueId"
      ,cc.dn_ccst_status as "cueStatusType"
      ,decode(cc.dn_ccst_status,'5',cc.cup_code,NULL) as  "cueCupType" )
      ,XMLElement("musicWork"  -- start level 6 tag for music title
        ,XMLFOREST(cc.title as "musicTitle")
        ,XMLFOREST(
          XMLFOREST(cc.source_album_title as "albumTitle"
            ,cc.product_album_promo_title as "promoTitle"
            ,cc.label as  "label"
            ,cc.catalogue_no as "catalogNumber"
            ,cc.isrc as "isrc") as "recordingInfo"  -- start level 7 tag for music title
          )
        )  -- end level 6 tag for music title
      )  -- end level 5 tag cue
    )
    FROM creation_components cc
    WHERE cc.prod_cre_surr_id = 22736214;
    

    使用虚拟数据来匹配您的示例输出,并使用 XMLSerialise 包装器来美化输出:

    WITH creation_components (prod_cre_surr_id, dn_ccst_status, cup_code, title,
      source_album_title, product_album_promo_title, label, catalogue_no, isrc) as
    (
      SELECT 22736214, 5, 'W', 'CLARE@RADIOWORKS.CO.UK',
        null, null, null, null, null from dual
    )
    SELECT XMLSERIALIZE(Document
      XMLAGG(XMLElement("Cue"  -- start level 5 tag for cue
        ,XMLFOREST( rownum as "cueId"
        ,cc.dn_ccst_status as "cueStatusType"
        ,decode(cc.dn_ccst_status,'5',cc.cup_code,NULL) as  "cueCupType" )
        ,XMLElement("musicWork"  -- start level 6 tag for music title
          ,XMLFOREST(cc.title as "musicTitle")
          ,XMLFOREST(
            XMLFOREST(cc.source_album_title as "albumTitle"
              ,cc.product_album_promo_title as "promoTitle"
              ,cc.label as  "label"
              ,cc.catalogue_no as "catalogNumber"
              ,cc.isrc as "isrc") as "recordingInfo"  -- start level 7 tag for music title
            )
          )  -- end level 6 tag for music title 
        )  -- end level 5 tag cue
      )
      as CLOB INDENT SIZE = 2
    )
    FROM creation_components cc
    WHERE cc.prod_cre_surr_id = 22736214;
    

    得到

    XMLSERIALIZE(DOCUMENTXMLAGG(XMLELEMENT("CUE"--STARTLEVEL5TAGFORCUE,XMLFOREST(ROW
    --------------------------------------------------------------------------------
    <Cue>
      <cueId>1</cueId>
      <cueStatusType>5</cueStatusType>
      <cueCupType>W</cueCupType>
      <musicWork>
        <musicTitle>CLARE@RADIOWORKS.CO.UK</musicTitle>
      </musicWork>
    </Cue>
    

    在后面的列中使用非空数据:

    WITH creation_components (prod_cre_surr_id, dn_ccst_status, cup_code, title,
      source_album_title, product_album_promo_title, label, catalogue_no, isrc) as
    (
      SELECT 22736214, 5, 'W', 'CLARE@RADIOWORKS.CO.UK',
        null, null, 'RadioWorks', null, null from dual
    )
    SELECT XMLSERIALIZE(Document
      XMLAGG(XMLElement("Cue"  -- start level 5 tag for cue
        ,XMLFOREST( rownum as "cueId"
        ,cc.dn_ccst_status as "cueStatusType"
        ,decode(cc.dn_ccst_status,'5',cc.cup_code,NULL) as  "cueCupType" )
        ,XMLElement("musicWork"  -- start level 6 tag for music title
          ,XMLFOREST(cc.title as "musicTitle")
          ,XMLFOREST(
            XMLFOREST(cc.source_album_title as "albumTitle"
              ,cc.product_album_promo_title as "promoTitle"
              ,cc.label as  "label"
              ,cc.catalogue_no as "catalogNumber"
              ,cc.isrc as "isrc") as "recordingInfo"  -- start level 7 tag for music title
            )
          )  -- end level 6 tag for music title
        )  -- end level 5 tag cue
      )
      as CLOB INDENT SIZE = 2
    )
    FROM creation_components cc
    WHERE cc.prod_cre_surr_id = 22736214;
    

    额外的标签仍然出现:

    XMLSERIALIZE(DOCUMENTXMLAGG(XMLELEMENT("CUE"--STARTLEVEL5TAGFORCUE,XMLFOREST(ROW
    --------------------------------------------------------------------------------
    <Cue>
      <cueId>1</cueId>
      <cueStatusType>5</cueStatusType>
      <cueCupType>W</cueCupType>
      <musicWork>
        <musicTitle>CLARE@RADIOWORKS.CO.UK</musicTitle>
        <recordingInfo>
          <label>RadioWorks</label>
        </recordingInfo>
      </musicWork>
    </Cue>
    

    【讨论】:

    • 再次更正 Alex Poole,您是真正的 XML SQL 专家。非常感谢您的所有帮助,它第一次使用它包含在额外的 XMLFOREST 中
    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    相关资源
    最近更新 更多