Question

L'extrait de code suivant sur le serveur SQL 2005 échoue sur l'esperluette '&':

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

Quelqu'un sait-il une solution de contournement?

Explication plus, je dois mettre à jour des données dans une colonne XML, et j'utilise une recherche et remplacer hack type par la coulée de la valeur XML à un varchar, faire le remplacer et mettre à jour la colonne XML avec ce casting.

Était-ce utile?

La solution

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

Un esperluette littéral dans une balise de XML n'est pas autorisé par la norme XML, et un tel document ne parviendra pas à analyser par un analyseur syntaxique XML.

Un XMLSerializer() sera la sortie codée HTML-ampersand.

Le code suivant:

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());
        }
    }
}

affichera le suivant:

<?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>

, avec un &amp; au lieu de &.

Autres conseils

Il est pas XML valide. Utilisez &amp;:

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

Vous aurez besoin de XML échapper le texte aussi.

Donc, nous allons revenir en arrière et supposons que vous construisez cette chaîne comme:

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

vous voulez faire quelque chose comme:

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

Bien sûr, vous devriez probablement répondre aux autres entités ainsi:

SELECT '<name>' + REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( MyColumn, '&', '&amp;' ), '''', '&apos;' ), '"', '&quot;' ), '<', '&lt;' ), '>', '&gt;' ) + '</name>' FROM MyTable

Lorsque vous travaillez avec XML dans SQL vous êtes beaucoup plus en sécurité au lieu des fonctions intégrées de conversion manuellement.

Le code suivant construit une variable XML appropriée SQL qui ressemble à votre sortie désirée basée sur une chaîne brute:

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

Comme John et de l'état Quassnoi, & sur son propre ne sont pas valides. En effet, le esperluette est le début d'une entité de caractère - utilisé pour spécifier des caractères qui ne peuvent pas être représentés littéralement. Il existe deux formes d'entités -. On spécifie le caractère par nom (par exemple, &amp; ou &quot;), et un le précise le caractère par son code (je crois qu'il est la position de code dans le jeu de caractères Unicode, mais pas sûr, par exemple, &#34; devrait représenter un guillemet).

Ainsi, pour inclure un & littéral dans un document HTML, vous devez l'indiquer est l'entité: &amp;. D'autres plus courantes que vous pouvez rencontrer sont &lt; pour <, &gt; pour > et &quot; pour ".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top