Давайте начнем с получения кода в следующем порядке:
Сначала мы создадим небольшую вспомогательную функцию, которая с учетом родительского элемента 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 & """]")