web-dev-qa-db-ja.com

T-SQL:XMLを自己終了タグのない文字列に変換します

統合している奇妙なシステムがあり、XMLを消費しますが、それはしない自己終了タグを理解するため、

<BOOKING>
  <BOOKINGID>56812</BOOKINGID>
  <PERSONCODE />
</BOOKING>

その能力を超えています。

私が持っているのがdeclare @x xml、どのように変換するのですか@x to string without自己終了タグがあります:

<BOOKING>
  <BOOKINGID>56812</BOOKINGID>
  <PERSONCODE></PERSONCODE>
</BOOKING>
5
Anton Gogolev

回避策は insert(XML DML) を使用して空のノードにありそうもない値を追加し、次に replace 文字列表現の値を使用することです。

declare @S nvarchar(max)

declare @XML xml = '
<BOOKING>
  <BOOKINGID>56812</BOOKINGID>
  <PERSONCODE />
</BOOKING>'

-- Add _ as value to all empty nodes
while @XML.exist('//*[.="" and count(*)=0]') = 1
  set @XML.modify('insert text{"_"} into (//*[.="" and count(*)= 0])[1]')

-- Cast to string and remove _ as value
set @S = replace(cast(@XML as nvarchar(max)), '>_<', '><')

select @S
4
Mikael Eriksson