如何解决使用Classic ASP将HTML保存为XML
| 我正在为我哥哥的网站开发一个非常简单的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>
节点,但是我已经解决了最坏的问题。
非常感谢!
安迪
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。