3

SQL Server 2005 の次のコード スニペットは、アンパサンド '&' で失敗します。

select cast('<name>Spolsky & Atwood</name>' as xml)

誰かが回避策を知っていますか?

より長い説明では、XML 列の一部のデータを更新する必要があります。XML 値を varchar にキャストし、このキャストで XML 列を置換して更新することで、検索と置換のタイプのハックを使用しています。

4

5 に答える 5

6

有効な XML ではありません。使用&amp;:

select cast('<name>Spolsky &amp; Atwood</name>' as xml)
于 2009-07-13T13:03:34.893 に答える
6
select cast('<name>Spolsky &amp; 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 &amp; Atwood</name>
</MyData>

、の&amp;代わりに&

于 2009-07-13T13:04:07.967 に答える
4

テキストも XML エスケープする必要があります。

それでは、バックトラックして、その文字列を次のように構築していると仮定しましょう。

SELECT '<name>' + MyColumn + '</name>' FROM MyTable

次のようなことをしたいでしょう:

SELECT '<name>' + REPLACE( MyColumn, '&', '&amp;' ) + '</name>' FROM MyTable

もちろん、次のように他のエンティティに対応する必要があります。

SELECT '<name>' + REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( MyColumn, '&', '&amp;' ), '''', '&apos;' ), '"', '&quot;' ), '<', '&lt;' ), '>', '&gt;' ) + '</name>' FROM MyTable
于 2009-07-13T13:07:19.667 に答える
3

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
于 2010-08-23T23:32:31.663 に答える