2017-11-14 13 views
1

xmltypeから空のタグを削除しようとします。私は、以下のxmlをOracleタイプから生成しています。コレクションでは、いくつかの要素は値を持たないので、空タグで生成されます。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> 

予想される出力:

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

[不要な空のXMLタグを取り除くにはどうすればよいですか?](https://stackoverflow.com/questions/36340104/how-can-i-get-rid-of-unwanted-empty-xml-tags ) –

+0

@KaushikNayak重複ではありません - あなたがリンクしているのは、空のXMLタグを含めずにXMLTypeを生成しようとしているのに対し、このXMLTypeはすでに存在しています。 – MT0

答えて

1

使用DELETEXMLをしていないが含まれている要素を見つけるために、XPath //*[not(text())][not(*)]を探しますテキストと子なし:

SQL Fiddle

Oracleの11グラム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> | 
+0

ありがとう@ MT0、あなたのソリューションは完璧に働いて.. :) – Gaja

関連する問題