Запазване на HTML в XML с помощта на Classic ASP

Разработвам много проста CMS система за уеб сайта на моя брат.
Използвам Classic ASP и съдържанието се съхранява в XML файл и създадох прост уеб формуляр с редактор с богат javascript текст, за да може той да редактира съдържание. Това означава, че в XML файла ще има записан HTML код. Убеден съм, че това винаги ще бъде добре оформен XHTML.

e.g.

<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 кодирането по този начин, но никъде не мога да намеря решение.

Ако някой може да ми помогне ще съм много благодарен.

Благодаря Анди


person AndyG    schedule 14.06.2011    source източник
comment
извън темата, но защо използвате класически ASP за нова разработка???   -  person Spudley    schedule 14.06.2011


Отговори (4)


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

person cordsen    schedule 14.06.2011
comment
Благодаря, Cordsen, използвах вашето решение с лека поправка - изглежда, че не мога да дам подробен отговор още 8 часа, тъй като съм начинаещ тук, така че ще публикувам пълното решение, което използвах утре сутрин. Благодаря Анди - person AndyG; 15.06.2011
comment
@AndyG - няма за какво. Ако искате да поставите вашите модификации в коментари, мога да актуализирам блока по-горе с вашите актуализации (разбира се, посочвайки вие). - person cordsen; 15.06.2011
comment
Здравейте Cordsen Това е, което направих в крайна сметка: (Ще трябва да направя това в няколко коментара, тъй като ми свършват символите!) frmDescription = Request.Form(description) 'Прекъсванията на редове във формуляра се срещат като ‹br› вместо ‹br /›' frmDescription = replace(frmDescription, ‹br›, ‹br /›) - person AndyG; 15.06.2011
comment
Set formDescriptionXML = Server.CreateObject(MSXML2.DOMDocument) formDescriptionXML.loadXML frmDescription If Not formDescriptionXML Is Nothing Then 'Премахване на съществуващия възел за описание' Задайте objRemove = objSaleItem.SelectSingleNode(description) objSaleItem.removeChild objRemove 'Създайте новия възел за описание' objSaleItem. appendChild formDescriptionXML.documentElement End If - person AndyG; 15.06.2011
comment
Все още трябва да проверя дали винаги имам само едно описание, но то решава проблема, който питах. Благодаря за помощта. Анди - person AndyG; 15.06.2011

Бих предложил да използвате CDATA за капсулиране на HTML

<![CDATA[ my_html_description ]]>

така че asp кодът ще изглежда така:

objField.text = "<![CDATA[" & Request.Form("description") & "]]>"
person Luka Milani    schedule 14.06.2011
comment
Здравей Лука, благодаря за отговора, но за съжаление това не работи. В крайна сметка получавам това в моя XML файл: <description>&lt;![CDATA[L&lt;sub&gt;o&lt;/sub&gt;vely &lt;sup&gt;old&lt;/sup&gt;&lt;span style="text-decoration: underline;"&gt;victorian &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;desk&lt;/span&gt;]]&gt;</description> Опитах да използвам <![CDATA[...]]> в XML, но дори и с това правилно кодирано, не се показва правилно, когато се изобразява на HTML страницата. Анди - person AndyG; 14.06.2011

objField.text = "‹![CDATA[" & Request.Form("описание") & "]]›"

Няма да се кодира.

person zbugs    schedule 14.06.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>, но реших най-лошия момент.

Много благодаря! Анди

person AndyG    schedule 15.06.2011