问题描述
|
我正在为我哥哥的网站开发一个非常简单的CMS系统。
我使用的是Classic ASP,内容存储在XML文件中,我已经创建了一个简单的Web表单,其中包含javascript富文本编辑器,供他编辑内容。这意味着将在HTML文件中保存HTML代码。我相信这将始终是格式良好的XHTML。
例如
<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><strong>18th</strong> century <span style=\"font-style: italic;\">mahogany </span>chest of drawers</description>
我在网上搜寻了一下,试图找出如何防止HTML像这样编码,但是我找不到任何解决方案。
如果有人可以帮助我,我将非常感激。
谢谢
安迪
解决方法
即使您确信表单的结果始终是有效的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
如果表单也只能包含文本,则可以使用“ 5”块处理该情况。
, 我建议使用CDATA封装HTML
<![CDATA[ my_html_description ]]>
因此,asp代码如下所示:
objField.text = \"<![CDATA[\" & Request.Form(\"description\") & \"]]>\"
, objField.text = \“ <![CDATA [\”&Request.Form(\“ description \”)&\“]]> \”
它不会被编码。
, 感谢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>
节点,但是我已经解决了最坏的问题。
非常感谢!
安迪