[英]Saving HTML in XML using Classic ASP
我正在为我兄弟的 web 站点开发一个非常简单的 CMS 系统。
我使用的是 Classic ASP,内容存储在 XML 文件中,我创建了一个简单的 web 表单,并使用 javascript 富文本编辑器供他编辑内容。 这意味着 HTML 代码将保存在 XML 文件中。 我相信这将始终是格式良好的 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>
当在 web 页面上显示此内容时,一切正常,只要我在 XSLT 文件中使用<xsl:copy-of select="description/node()"/>
,Z4C4AD5FCA2E7A3F74DBB1CED00381AAAA 就应该显示它。
当我尝试将这个 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>
我已经搜索了 web 试图找出如何防止 HTML 被这样编码,但我在任何地方都找不到解决方案。
如果有人可以帮助我,我将不胜感激。
谢谢安迪
objField.text = "<.[CDATA[" & Request.Form("description") & "]]>"
它不会被编码。
我建议使用 CDATA 封装 HTML
<![CDATA[ my_html_description ]]>
所以asp代码看起来像这样:
objField.text = "<![CDATA[" & Request.Form("description") & "]]>"
即使您确信表单的结果始终是有效的 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
块处理该条件。
感谢 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>
节点,但我已经解决了最糟糕的一点。
非常感谢! 安迪
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.