Ошибка в форматировании строки XML с CDATA - PullRequest
1 голос
/ 07 октября 2010

Я получаю эту ошибку «Начальный тег в строке 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 ]

1 голос
/ 07 октября 2010
  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);
    }
}
1 голос
/ 07 октября 2010

Пара вещей:

  • Анализ вашего rawXml (т.е. создание экземпляра XmlDocument) совершенно излишен.
  • Вы, должно быть, сделали некоторую опечатку в необработанном XML. То, что вы предоставили, выглядит как совершенно корректный XML (фактически проходит проверку W3C).
  • Не создавайте SQL-запрос, используя String.Format. Вместо этого используйте параметры запроса SQL. Причина в том, что в результате вы получаете недопустимый оператор SQL, а также открываете двери для атак с использованием SQL-инъекций.
...