web-dev-qa-db-ja.com

XMLに変換する前にTSQLでXML文字をエスケープする方法

XML構造があり、これは私のストアドプロシージャの入力パラメーターです。 の要素が含まれます(XMLではエスケープされます)。その要素をVARCHARに抽出すると、有効なXML文字ではないを受け取ります。もう一度XMLに変換する前に、それをエスケープする必要があります。 REPLACEなしでそれを行うには?

次のテキストがあります:_param1=xyz&para2=dasdasdfdas&param3_。クエリ文字列の一部です。これをXMLに変換し、XML構造の一部として送信します。

_<zzz xmlns="http://example.com">
  <aaa>aaa</aaa>
  <bbb>param1=xyz&amp;para2=dasdasdfdas&amp;param3</bbb>
</zzz>
_

ストアドプロシージャの内部で抽出する必要があります。私はそれをします:

_ISNULL(NULLIF(LTRIM(RTRIM(@XMLInput.value('declare default element namespace "http://example.com"; (zzz/bbb)[1]', 'NVARCHAR(250)'))), ''), '');
_

その後、値には通常のテキストが含まれます(-sはエスケープされません-)。

いくつかの処理の後、その文字列を他のXML内に配置する必要があります。私が作る:

CAST( ... AS XML);

-sがエスケープされていないため、エラーが発生しました。

5
Bogdan Bogdanov

使用する for xml pathキャストの代わりにXMLを作成します。

select @YourVariable for xml path(''), type

パス式に空の文字列があり、返された列にエイリアスがない場合、文字列はxmlとして返されます。

9
Mikael Eriksson

これは完全に有効なXMLです。 XMLデータ型の.valueメソッドを使用してbbb要素を抽出すると、その時点で要素の識別が解除されます。たとえば、

Results

たとえば、XMLデータ型の.modifyメソッドを使用して、特別な処理や置換を行わずに要素を抽出および追加できます。

DECLARE @xml XML = '<zzz xmlns="http://example.com">
  <aaa>aaa</aaa>
  <bbb>param1=xyz&amp;para2=dasdasdfdas&amp;param3</bbb>
</zzz>'

SELECT @xml [before], DATALENGTH(@xml) dl

DECLARE @b VARCHAR(100)

;WITH XMLNAMESPACES ( DEFAULT 'http://example.com' )
SELECT @b = @xml.value('(zzz/bbb/text())[1]', 'VARCHAR(100)')

SELECT @b

SET @xml.modify('declare default element namespace "http://example.com"; insert element bbb { sql:variable("@b") } after (zzz/bbb)[1]')

SELECT @xml [after], DATALENGTH(@xml) dl
4
wBob