2010-10-07 2 views
1

Je reçois cette erreur "La balise de début sur la ligne 1 ne correspond pas à la balise de fin de 'document'".Erreur lors de la mise en forme d'une chaîne XML avec CDATA

string rawXml = "<?xml version='1.0' ?>" + 
     "<document>" + 
      "<![CDATA[" + 
       "<topic>" + 
        "My test" + 
       "</topic>" + 
      "]]>" + 
     "</document>"; 

Erreur lors de l'exécution d'une procédure stockée qui envoie ce fichier XML en tant que paramètre.

var xmlDoc = new XmlDocument(); 
    xmlDoc.LoadXml(rawXml); 

    DataResultXElement drx = ss.xelem_Query(string.Format("exec Topic_Update '{0}', '{1}'", sessionId, xmlDoc.InnerXml)); 

Si je supprime cela fonctionne, mais j'ai besoin de CDATE pour stocker les données correctement dans la base de données.

Dois-je formater la chaîne différemment? Merci!

+0

Vous ne devriez pas utiliser une chaîne du tout! –

+0

Merci pour votre commentaire mais qu'en est-il de la solution? Comment puis-je envoyer ces données XML? – podeig

Répondre

1
  1. Ne pas utiliser la manipulation de chaînes pour construire des documents XML. N'utilisez pas la manipulation de chaînes pour construire des requêtes SQL.

Pour ce faire, à la place:

StringBuilder sb = new StringBuilder(); 
using (StringWriter sw = new StringWriter(sb)) 
using (XmlWriter xw = XmlWriter.Create(sw)) 
{ 
    xw.WriteStartElement("document"); 
    xw.WriteCData("<topic>My test </topic>"); 
    xw.WriteEndElement(); 
} 

XDocument result = new XDocument(); 
using (SqlConnection conn = new SqlConnection(connectionString)) 
{ 
    conn.Open(); 
    SqlCommand cmd = new SqlCommand("Topic_Update", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.AddWithValue("SessionID", sessionId); 
    cmd.Parameters.AddWithValue("XmlText", sb.ToString()); 
    using (XmlReader xr = cmd.ExecuteXmlReader()) 
    { 
     result.Load(xr); 
    } 
} 
+0

Merci pour l'explication! Mais pourquoi ai-je cette erreur? "La balise de début sur la ligne 1 ne correspond pas à la balise de fin de 'document'". Parce que le XMl est mal formaté? Ou je ne devrais pas utiliser des chaînes pour construire SQL? – podeig

+1

Je pense que ça se passe parce que vous utilisez 'string.Format' pour construire votre SQL. Le XML contient des apostrophes et la chaîne SQL utilise des apostrophes pour délimiter les paramètres. C'est l'une des nombreuses raisons d'utiliser des requêtes paramétrées. –

1

Couple de choses:

  • L'analyse syntaxique de votre rawXml (à savoir la construction de l'instance XmlDocument) est tout à fait superflu.
  • Vous devez avoir fait une faute de frappe dans le fichier XML brut. Ce que vous avez fourni ressemble à un XML parfaitement valide (en réalité, il passe la validation du W3C).
  • Ne construisez pas une requête SQL en utilisant String.Format. Utilisez plutôt les paramètres de requête SQL. La raison est de cette façon que vous vous retrouvez avec une déclaration SQL invalide et ouvre également la porte à des attaques par injection SQL.