Utilice signo en el molde en SQL
-
12-09-2019 - |
Pregunta
El siguiente fragmento de código en el servidor SQL 2005 falla en el signo '&':
select cast('<name>Spolsky & Atwood</name>' as xml)
¿Alguien sabe una solución?
explicación más larga, tengo que actualizar algunos datos en una columna XML, y estoy usando una búsqueda y reemplazar tipo truco echando el valor XML a un varchar, haciendo el reemplazar y actualizar la columna XML con este elenco.
Solución
select cast('<name>Spolsky & Atwood</name>' as xml)
A ampersand literal dentro de una etiqueta XML
no está permitido por la norma XML
, y un documento de tal fallará para analizar por cualquier analizador XML
.
será codificada XMLSerializer()
Un HTML
salida el símbolo de unión.
El siguiente código:
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());
}
}
}
salida voluntad lo siguiente:
<?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>
, con una &
en lugar de &
.
Otros consejos
No es XML válido. Uso &
:
select cast('<name>Spolsky & Atwood</name>' as xml)
Se necesitaría a XML escapar el texto, también.
Así que vamos a dar marcha atrás y asumir que estamos construyendo esa cadena como:
SELECT '<name>' + MyColumn + '</name>' FROM MyTable
te gustaría hacer algo más como:
SELECT '<name>' + REPLACE( MyColumn, '&', '&' ) + '</name>' FROM MyTable
Por supuesto, es probable debe atender a las otras entidades así:
SELECT '<name>' + REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( MyColumn, '&', '&' ), '''', ''' ), '"', '"' ), '<', '<' ), '>', '>' ) + '</name>' FROM MyTable
Al trabajar con XML en SQL que está mucho más seguro usando funciones incorporadas en lugar de convertir de forma manual.
El siguiente código va a construir una variable XML SQL adecuado que se parece a su salida deseada en base a una cadena de texto:
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
Como Juan y el estado Quassnoi, &
por sí mismo no es válido. Esto es debido a que el carácter y comercial es el comienzo de una entidad de caracteres - se usa para especificar caracteres que no se pueden representar literalmente. Hay dos tipos de personas -. Uno especifica el personaje por su nombre (por ejemplo, &
o "
), y uno, se especifica el carácter por su código (creo que es la posición del código dentro del conjunto de caracteres Unicode, pero no está seguro, por ejemplo, "
debe representar un doble cita).
Por lo tanto, para incluir un &
literal en un documento HTML, se debe especificar que es la entidad: &
. Otros más comunes que pueden surgir son <
para <
, >
para >
y "
para "
.