2010-10-07 55 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注入攻擊打開大門。