SQL Server 2005 の次のコード スニペットは、アンパサンド '&' で失敗します。
select cast('<name>Spolsky & Atwood</name>' as xml)
誰かが回避策を知っていますか?
より長い説明では、XML 列の一部のデータを更新する必要があります。XML 値を varchar にキャストし、このキャストで XML 列を置換して更新することで、検索と置換のタイプのハックを使用しています。
SQL Server 2005 の次のコード スニペットは、アンパサンド '&' で失敗します。
select cast('<name>Spolsky & Atwood</name>' as xml)
誰かが回避策を知っていますか?
より長い説明では、XML 列の一部のデータを更新する必要があります。XML 値を varchar にキャストし、このキャストで XML 列を置換して更新することで、検索と置換のタイプのハックを使用しています。
有効な XML ではありません。使用&:
select cast('<name>Spolsky & Atwood</name>' as xml)
select cast('<name>Spolsky & Atwood</name>' as xml)
XMLタグ内のリテラル アンパサンドはXML標準では許可されておらず、そのようなドキュメントはどのXMLパーサーでも解析できません。
AnXMLSerializer()は、アンパサンドをエンコードして出力しHTMLます。
次のコード:
using System.Xml.Serialization;
namespace xml
{
public class MyData
{
public string name = "Spolsky & Atwood";
}
class Program
{
static void Main(string[] args)
{
new XmlSerializer(typeof(MyData)).Serialize(System.Console.Out, new MyData());
}
}
}
以下を出力します。
<?xml version="1.0" encoding="utf-8"?>
<MyData
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<name>Spolsky & Atwood</name>
</MyData>
、の&代わりに&。
テキストも XML エスケープする必要があります。
それでは、バックトラックして、その文字列を次のように構築していると仮定しましょう。
SELECT '<name>' + MyColumn + '</name>' FROM MyTable
次のようなことをしたいでしょう:
SELECT '<name>' + REPLACE( MyColumn, '&', '&' ) + '</name>' FROM MyTable
もちろん、次のように他のエンティティに対応する必要があります。
SELECT '<name>' + REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( MyColumn, '&', '&' ), '''', ''' ), '"', '"' ), '<', '<' ), '>', '>' ) + '</name>' FROM MyTable
SQLでXMLを操作する場合、手動で変換するのではなく、組み込み関数を使用する方がはるかに安全です。
次のコードは、生の文字列に基づいて目的の出力のように見える適切なSQLXML変数を作成します。
DECLARE @ExampleString nvarchar(40)
, @ExampleXml xml
SELECT @ExampleString = N'Spolsky & Atwood'
SELECT @ExampleXml =
(
SELECT 'Spolsky & Atwood' AS 'name'
FOR XML PATH (''), TYPE
)
SELECT @ExampleString , @ExampleXml