Сохранение HTML в XML с использованием Classic ASP - PullRequest
3 голосов
/ 14 июня 2011

Я занимаюсь разработкой очень простой системы CMS для веб-сайта моего брата.
Я использую Classic ASP, и контент хранится в файле XML, и я создал простую веб-форму с редактором форматированного текста javascript, чтобы он мог редактировать контент. Это означает, что в файле XML будет сохранен 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>

При отображении этого на веб-странице все работает нормально, и пока я использую <xsl:copy-of select="description/node()"/> в файле XSLT, 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 таким образом, но я нигде не могу найти решение.

Если кто-нибудь сможет мне помочь, я буду очень признателен.

Спасибо Andy

Ответы [ 4 ]

1 голос
/ 15 июня 2011

Спасибо Кордсену за то, что он указал мне правильное направление.

Я использовал предложенное вами решение с небольшой поправкой, и пока он работает нормально!

Я обнаружил, что получаювсе больше и больше вложенных тегов <description> в окончательном XML, поэтому я сначала удалил существующий узел <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> узел, но я решил худший бит.

Большое спасибо!Andy

1 голос
/ 14 июня 2011

Я бы предложил использовать CDATA для инкапсуляции HTML

<![CDATA[ my_html_description ]]>

поэтому код asp будет выглядеть так:

objField.text = "<![CDATA[" & Request.Form("description") & "]]>"
1 голос
/ 14 июня 2011

Даже если вы уверены, что результаты вашей формы всегда являются действительным 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.

1 голос
/ 14 июня 2011

objField.text = ""

Не будет закодировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...