2011-06-14 46 views
3

我正在爲我兄弟的網站開發一個非常簡單的CMS系統。
我使用的是經典ASP,內容存儲在一個XML文件中,我創建了一個簡單的帶有JavaScript富文本編輯器的Web表單,供他編輯內容。這意味着將會有HTML代碼保存在XML文件中。我相信,這將始終是格式良好的XHTML。使用經典ASP將XML保存爲XML

例如

<content> 
<item id="20110611103415" sort="1" status="P"> 
<description><strong>18th</strong> century <span style="font-style: italic;">mahogany </span>chest of drawers</description> 
</item> 
</content> 

當網頁上顯示這一點,一切工作確定,只要我在XSLT文件中使用<xsl:copy-of select="description/node()"/>的HTML顯示爲它應該。

當我嘗試將此HTML保存回表單中的XML文件時,問題就出現了。我使用下面的代碼來做到這一點:

set objXML = Server.CreateObject("MSXML2.DOMDocument") 
objXML.async = false 
strXMLFile = server.MapPath("content.xml") 
objXML.load strXMLFile 

Set objRoot = objXML.documentElement 

Set objItem = objRoot.SelectSingleNode("item[@id='" & strID & "']") 
Set objField = objSaleItem.SelectSingleNode("description") 
objField.text = Request.Form("description") 
objXML.save strXMLFile 

當我這樣做我結束了我的XML文件中的以下內容:

<description>&lt;strong&gt;18th&lt;/strong&gt; century &lt;span style="font-style: italic;"&gt;mahogany &lt;/span&gt;chest of drawers</description> 

我已經沖刷網頁試圖找出如何我可以防止HTML被編碼,但我無法在任何地方找到解決方案。

如果有人能幫助我,我會非常感激。

感謝 安迪

+0

偏離主題,但爲什麼你使用傳統的ASP進行新的發展? – Spudley 2011-06-14 16:20:59

回答

1

即使你有信心,你的表格的結果總是有效的XHTML,你應該通過將它加載到DOM解析器來驗證它。這將強制它是有效的,並允許您保存並重新獲取它。

set formDescriptionXML = Server.CreateObject("MSXML2.DOMDocument") 

' loadXML returns a false if the XML is not valid 
If Not (formDescriptionXML.loadXML (Request.Form("description"))) Then 
    ' handle the load error 
End If 

Set objRoot = objXML.documentElement 

Set objItem = objRoot.SelectSingleNode("item[@id='" & strID & "']") 
Set objField = objSaleItem.SelectSingleNode("description") 

objField.appendChild(formDescriptionXML.documentElement) 

objXML.save strXMLFile 

如果表單只能包含文本以及可以處理與If Then塊的條件。

+0

謝謝科爾森 我已經使用了你的解決方案,稍作修改 - 似乎我不能把詳細的答案提出了另一個8小時,因爲我是一個新手在這裏,所以我會張貼我明天使用的完整解決方案早上。 謝謝 Andy – AndyG 2011-06-14 20:29:49

+0

@AndyG - 不客氣。如果你想在你的評論中進行修改,我可以用你的更新來更新上面的代碼塊(當然,給你歸屬地)。 – cordsen 2011-06-14 21:22:39

+0

嗨Cordsen這是我最後還是沒買:(!我必須做這幾種意見,因爲我跑出來的char) \t \t frmDescription =的Request.Form(「說明」) \t \t \t \t frmDescription '換行符的形式橫跨作爲
代替
未來'=取代(frmDescription, 「
」, 「
」) – AndyG 2011-06-15 06:39:40

1

objField.text = 「<![CDATA [」 &的Request.Form( 「說明」)& 「]] >」

它不會進行編碼。

1

我會建議使用CDATA來封裝HTML

<![CDATA[ my_html_description ]]> 

所以ASP代碼將看起來像這樣:

objField.text = "<![CDATA[" & Request.Form("description") & "]]>" 
+0

嗨盧卡 感謝您的答覆,但不幸的是,這是行不通的。我結束了這在我的XML文件: ' < [CDATA [L <子>Ø< /子> vely <燮>老</SUP > <跨度風格= 「文本裝飾:下劃線;」! >維多利亞式</span > < span style =「font-weight:bold;」我試過在XML中使用'<![CDATA [...]]>',但即使這個編碼正確,它在渲染時也不能正確顯示在HTML頁面上。 Andy – AndyG 2011-06-14 18:45:28

1

感謝Cordsen爲我指出了正確的方向。

我用你的建議解決方案進行了一些修改,目前它工作正常!

我發現我是在最後的XML越來越嵌套<description>標籤,所以我先刪除現有<description>節點,然後附加新的一個:

frmDescription = Request.Form("description") 
    'Line breaks in the form are coming across as <br> instead of <br />' 
    frmDescription = replace(frmDescription, "<br>", "<br />") 

    Set formDescriptionXML = Server.CreateObject("MSXML2.DOMDocument") 
    formDescriptionXML.loadXML frmDescription 
    If Not formDescriptionXML Is Nothing Then 
     'Remove the existing description node' 
     Set objRemove = objSaleItem.SelectSingleNode("description") 
     objSaleItem.removeChild objRemove 
     'Create the new description node ' 
     objSaleItem.appendChild formDescriptionXML.documentElement 
    End If 

我仍然需要做一點努力確保我總是隻有一個<description>節點,但我解決了最壞的一點。

非常感謝! 安迪