Страницы на сайте Classic ASP не будут загружаться после ввода кода на одной странице - PullRequest
1 голос
/ 16 февраля 2012

Этот сайт работал должным образом, прежде чем я столкнулся с ошибкой после ввода некоторого кода. Код не был на главной странице, но ни одна из страниц сайта не будет загружена. Я перезапустил сайт в IIS, и это не помогло.

Вот код, который я ввел:

'Prepare to parse XML
Set objXML = Server.CreateObject(Microsoft.XMLDOM)

'Set Asynchoronous = false
objXML.async = False

'Load the XML file.
'User Server.MapPath method is the XML is located in your site.
'Else you can use the absolute path.
objXML.Load (Server.MapPath(Products.xml))

'If there is any errors pasring the file the notify
If objXML.parseError.errorCode = 0 Then        
    'Response.Write(objXML.parseError.reason)
Else objXML.parseError.errorCode <> 0 Then
    'Get ALL the Elements by the tag name product
    Set products = objXML.getElementsByTagName(product)

    Select Case iItemID
        Case 1
            aParameters = Array(products.item(0).childNodes(0).text, products.item(i).childNodes(2).text, products.item(i).childNodes(2).text)
        Case 2
            aParameters = Array(products.item(1).childNodes(0).text, products.item(i).childNodes(2).text, products.item(i).childNodes(2).text)        
    End Select

    ' Return array containing product info.
    GetItemParameters = aParameters
End If

Запуск IIS в Windows 7 с использованием классического ASP. Редактирование с помощью Блокнота ++.

Вот файл XML:

<configuration>
<products>
    <product>   
        <image>
            <![CDATA[ /Images/Atlas Gloves.jpg ]]>
        </image>    
        <name>
            <![CDATA[ Atlas Nitrile Touch Gloves ]]>
        </name>
        <description>
            <![CDATA[ Atlas Nitrile Touch is available in 6 vibrant colors, and is America’s #1 glove for the Lawn and Garden market. Atlas gloves have a breathable nylon back and are machine washable. Like a “second skin,” these gloves are the most comfortable! Atlas Nitrile gloves are the #1 gardening gloves. Atlas Nitrile gloves act like a "second skin" between the user and their work, offering full dexterity and grip. Atlas Nitrile Gloves are perfect for gardening, but their uses expand to so many places – the woodshop, the workshop, the workplace. ]]>
        </description>
        <size>
            <![CDATA[ Small, Medium ]]>
        </size>
        <color>
            <![CDATA[ Purple, Pink, Green, Orange ]]>
        </color>
    </product>
</products>
</configuration>

1 Ответ

2 голосов
/ 17 февраля 2012

Давайте начнем с получения кода в следующем порядке:

Сначала мы создадим небольшую вспомогательную функцию, которая с учетом родительского элемента XML и XPath (может быть просто tagName дочернего элемента) будет возвращать текстовое значение элемента. В этом случае я сознательно выбрал возвращать ноль, если элемент не найден, но вы можете оставить возвращаемое значение пустым, если вы предпочитаете:

Function GetElemText(parentElem, path)
     Dim elem: Set elem = parentElem.selectSingleNode(path)
     If Not elem Is Nothing Then
         GetElemText = elem.text
     Else
         GetElemText = null
     End If
End Function

Теперь мы создадим небольшой класс VBScript, в котором есть поле для каждого из элементов продукта. В этом классе есть метод LoadFromXml, который с помощью элемента xml продукта извлекает значения полей.

Class Product

    Public Image
    Public Name
    Public Description
    Public Size
    Public Color

    Public Sub LoadFromXml(prodElem)
         Image = GetElemText(prodElem, "image")
         Name = GetElemText(prodElem, "name")
         Description = GetElemText(prodElem, "description")
         Size = GetElemText(prodElem, "size")
         Color = GetElemText(prodElem, "color")
    End Sub

End Class

Наконец, мы создаем функцию GetProduct, которая с учетом индекса продукта будет загружать возвращаемый экземпляр класса Product, загруженный соответствующими деталями продукта.

Function GetProduct(productIndex)

    Dim objXML: Set objXML = Server.CreateObject("MSXML2.DOMDocument.3.0") 

    objXML.async = False 
    objXML.setProperty "SelectionLanguage", "XPath"
    objXML.Load Server.MapPath("Products.xml") ''# Assumes Products xml in same folder as this script 

    Dim elem: Set elem = objXML.documentElement.selectSingleNode("products/product[" & productIndex & "]") 
    If Not elem Is Nothing Then
        Set GetProduct = new Product
        GetProduct.LoadFromXml elem
    Else
        Set GetProduct = Nothing
    End If

End Function

Обратите внимание, что использование именованных элементов устраняет необходимость в "магических числах", значения которых вы должны либо запомнить, либо поместить в константы, и они очень хрупкие. Также использование XPath в качестве языка выбора и более конкретного ProgID. В целом, гораздо надежнее и в этом случае также работает.

Если ваши продукты xml остаются довольно статичными в течение срока службы приложения, учтите это изменение:

Function GetProduct(productIndex)

    Dim objXML
    If IsEmpty(Application.Contents("Products")) Then
        Set objXML = Server.CreateObject("MSXML2.FreeThreadedDOMDocument.3.0") 
        objXML.async = False 
        objXML.setProperty "SelectionLanguage", "XPath"
        Set Application.Contents("Products") = objXML
    Else
        Set objXML = Application.Contents("Products")
    End If

    objXML.Load Server.MapPath("Products.xml") ''# Assumes Products xml in same folder as this script 

    Dim elem: Set elem = objXML.documentElement.selectSingleNode("products/product[" & productIndex & "]") 
    If Not elem Is Nothing Then
        Set GetProduct = new Product
        GetProduct.LoadFromXml elem
    Else
        Set GetProduct = Nothing
    End If

End Function

Это загружает XML DOM в магазин приложений, сохраняя стоимость перезагрузки каждый раз, когда требуется продукт.

Еще одно изменение, которое я бы порекомендовал, - зависимость порядкового положения элемента продукта для его извлечения довольно хрупкая. Попробуйте добавить атрибут id="1" к элементу продукта. Затем его можно получить с помощью:

    Dim elem: Set elem = objXML.documentElement.selectSingleNode("products/product[@id=""" & productIndex & """]")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...