【问题标题】:Delete Empty tag from xmltype oracle从 xmltype oracle 中删除空标签
【发布时间】:2018-04-27 19:38:07
【问题描述】:

我想尝试从 xmltype 中删除空标签。我已经从 oracle 类型生成了以下 xml。在集合中,很少有元素没有值,所以我用空标签生成。

谁能帮帮我:

实际输出:

<MESSAGE>
<LOCATIONS>
  <LOCATION_ID>9999</LOCATION_ID>
  <LOC_TYPE>S</LOC_TYPE>
  <NAME>Test Location</NAME> 
  <PHONE_NUM>08 </PHONE_NUM>
   <LAST_MODIFIED_BY/>
   <LAST_MODIFIED_DATE/>
   <POS_CODE/>
</LOCATIONS>
</MESSAGE>

预期输出:

<MESSAGE>
<LOCATIONS>
  <LOCATION_ID>9999</LOCATION_ID>
  <LOC_TYPE>S</LOC_TYPE>
  <NAME>Test Location</NAME> 
  <PHONE_NUM>08 </PHONE_NUM>
</LOCATIONS>
</MESSAGE>

【问题讨论】:

  • @KaushikNayak 不是重复项 - 您链接的那个试图生成 XMLType 而不包含空 XML 标签,而这个 XMLType 已经存在,包含需要删除的空 XML 标签。

标签: sql xml oracle


【解决方案1】:

使用 DELETEXML 并查找 XPath //*[not(text())][not(*)] 以查找不包含文本和子项的元素:

SQL Fiddle

Oracle 11g R2 架构设置

CREATE TABLE table_name ( xml ) AS
SELECT XMLTYPE( '<MESSAGE>
<LOCATIONS>
  <LOCATION_ID>9999</LOCATION_ID>
  <LOC_TYPE>S</LOC_TYPE>
  <NAME>Test Location</NAME> 
  <PHONE_NUM>08 </PHONE_NUM>
   <LAST_MODIFIED_BY/>
   <LAST_MODIFIED_DATE/>
   <POS_CODE/>
</LOCATIONS>
</MESSAGE>' ) FROM DUAL;

查询 1

SELECT DELETEXML(
         xml,
         '//*[not(text())][not(*)]'
       ).getStringVal()
FROM   table_name

Results

|                                                                                            DELETEXML(XML,'//*[NOT(TEXT())][NOT(*)]').GETSTRINGVAL() |
|-----------------------------------------------------------------------------------------------------------------------------------------------------|
| <MESSAGE><LOCATIONS><LOCATION_ID>9999</LOCATION_ID><LOC_TYPE>S</LOC_TYPE><NAME>Test Location</NAME><PHONE_NUM>08 </PHONE_NUM></LOCATIONS></MESSAGE> |

【讨论】:

    【解决方案2】:
        SELECT
            deletexml(xml_data, '//*[not(text())][not(*)]').getstringval()
        FROM
            (
                SELECT
                    xmltype('<MESSAGE>
        <LOCATIONS>
          <LOCATION_ID>9999</LOCATION_ID>
          <LOC_TYPE>S</LOC_TYPE>
          <NAME>Test Location</NAME> 
          <PHONE_NUM>08 </PHONE_NUM>
           <LAST_MODIFIED_BY/>
           <LAST_MODIFIED_DATE/>
           <POS_CODE/>
        </LOCATIONS>
        </MESSAGE>'
                    ) xml_data
                FROM
                    dual
            )
    

    这很好,谢谢

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      • 2012-01-26
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多