2017-09-19 1 views
1

Le code suivant transmet un paramètre XML à une procédure stockée. Le SqlXml est converti à partir d'une chaîne.Le code XML assigné au paramètre SqlXml est-il codé en plus?

var range = GetXml("<Range><Column Name=\"Id\" Low=\"5002\" High=\"8076\" /></Range>"); 
cmd.Parameters.Add(new SqlParameter("@Range", SqlDbType.Xml) { Value = range }); 

SqlXml GetXml(string s) 
{ 
    var memoryStream = new MemoryStream(); 
    var settings = new XmlWriterSettings(); 
    settings.OmitXmlDeclaration = true; 
    settings.ConformanceLevel = ConformanceLevel.Fragment; 

    using (var xmlWriter = XmlWriter.Create(memoryStream, settings)) 
    { 
     xmlWriter.WriteString(s); 
     return new SqlXml(memoryStream); 
    } 
} 

Cependant, il se trouve la valeur réelle XML transmis à la procédure stockée est

N'&lt;Range&gt;&lt;Column Name="Id" Low="5002" High="8076" /&gt;&lt;/Range&gt;' 

La valeur a été capturée à l'aide de profils SQL Server.

Comment puis-je supprimer le codage supplémentaire de < et>?

+0

Utilisation: System.Net.WebUtility.HtmlDecode (chaîne); – jdweng

+0

Il semble qu'il soit codé sur la bibliothèque ado.net. La fonction ne résoudra pas le problème – ca9163d9

+0

Cela me semble bien: string input = "N '<Plage> < Nom de la colonne = \" Id \ "Bas = \" 5002 \ "Élevé = \" 8076 \ "/ > </Plage > '"; sortie de chaîne = System.Net.WebUtility.HtmlDecode (entrée); – jdweng

Répondre

2

N'utilisez pas XmlWriter.WriteString. Le but de cette méthode est d'ajouter le texte brut contenu à un élément, la méthode remplace &, < et > caractères avec & amp;, & lt;, et & gt;.

Pour traiter la chaîne au format XML au lieu de texte brut, vous pouvez créer un XmlReader de la chaîne, puis passer le XmlReader à l'SqlXml(XmlReader) constructor:

// using System.Data.SqlTypes; 
// using System.IO; 
// using System.Xml; 

static SqlXml GetXml(string s) 
{ 
    return new SqlXml(XmlReader.Create(new StringReader(s))); 
} 
1

Une façon sûre pour la coulée des chaînes est d'utiliser un encodage par exemple:

public static SqlXml GetXml(string s) 
{ 
    var encoding = new UTF8Encoding(); 
    var memoryStream = new MemoryStream(encoding.GetBytes(s)); 
    return new SqlXml(memoryStream); 
}