使用CDATA格式化XML字符串时出错

时间:2010-10-07 15:44:58

标签: asp.net xml stored-procedures cdata

我收到此错误“第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才能在数据库中正确存储数据。

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

2 个答案:

答案 0 :(得分:1)

一些事情:

  • 解析rawXml(即构建XmlDocument实例)是完全多余的。
  • 您必须在原始XML中输入一些拼写错误。您提供的内容看起来像一个完全有效的XML(实际上通过了W3C的验证)。
  • 不要使用String.Format构造SQL查询。请改用SQL查询参数。原因是这样你最终会得到一个无效的SQL语句,并为SQL注入攻击打开了大门。

答案 1 :(得分:1)

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

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

  3. 请改为:

    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);
        }
    }