我收到此错误“第1行的开始标记与'文档'的结束标记不匹配”。
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 :(得分:1)
一些事情:
rawXml
(即构建XmlDocument
实例)是完全多余的。String.Format
构造SQL查询。请改用SQL查询参数。原因是这样你最终会得到一个无效的SQL语句,并为SQL注入攻击打开了大门。答案 1 :(得分:1)
不要使用字符串操作来构造XML文档。
不要使用字符串操作来构造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);
}
}