2010-10-07 94 views
1

我收到此错误“第1行的开始标记与'document'的结束标记不匹配”。使用CDATA格式化XML字符串时出错

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

当我尝试执行发送此xml作为参数的存储过程时发生错误。

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

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

如果我删除它的作品,但我需要CDATE在数据库中正确存储数据。

我应该以不同的方式格式化字符串吗?谢谢!

+0

你不应该使用一个字符串在所有! – 2010-10-07 15:48:59

+0

感谢您的评论,但解决方案呢?我怎样才能发送这个XML数据? – podeig 2010-10-07 15:59:31

回答

1
  1. 不要使用字符串操作来构造XML文档。

  2. 不要使用字符串操作来构造SQL查询。

而是执行此操作:

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

谢谢你的解释!但为什么我会得到这个错误? “第1行的开始标记与'document'”的结束标记不匹配。由于XMl格式不正确?或者我不应该使用字符串来构造SQL? – podeig 2010-10-08 09:05:51

+1

我想这是因为你使用'string.Format'来构造你的SQL。 XML包含撇号,并且SQL字符串使用撇号来分隔参数。这是使用参数化查询的众多原因之一。 – 2010-10-08 17:12:38

1

几件事情:

  • rawXml(即构建XmlDocument实例)的解析完全是多余的。
  • 您必须在原始XML中制作了一些错字。你提供的东西看起来像一个完全有效的XML(实际上通过了W3C的验证)。
  • 请勿使用String.Format构造SQL查询。改用SQL查询参数。原因就是这种方式最终会导致无效的SQL语句,并为SQL注入攻击打开大门。