ZetCode

VBScript MSXML2.IXMLDOMNodeList 对象

最后修改于 2025 年 4 月 9 日

VBScript 中的 MSXML2.IXMLDOMNodeList 对象代表 XML 节点的集合。它是 Microsoft XML Core Services (MSXML) 库的一部分。该对象提供了访问和操作 XML 文档中节点的方法。它通常由 getElementsByTagName 等方法返回。

IXMLDOMNodeList 允许遍历节点并通过索引访问它们。它维护节点在 XML 文档中出现的顺序。本教程将通过实际示例介绍 IXMLDOMNodeList,以演示其在 VBScript 中的用法。

IXMLDOMNodeList 对象概述

IXMLDOMNodeList 接口提供了几个关键属性和方法。length 属性返回集合中节点的数量。item 方法通过索引位置检索节点。

集合中的节点是从零开始索引的。该对象是活动的,这意味着对 XML 文档的更改会自动反映出来。理解此对象对于 VBScript 应用程序中的有效 XML 处理至关重要。

基本 NodeList 遍历

此示例演示了如何加载 XML 文档并遍历 NodeList 中的所有节点。我们将使用 getElementsByTagName 方法检索所有具有特定标签名的元素。

basic_nodelist.vbs
Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")
xmlDoc.async = False
xmlDoc.load("books.xml")

If xmlDoc.parseError.errorCode <> 0 Then
    WScript.Echo "Error loading XML: " & xmlDoc.parseError.reason
    WScript.Quit
End If

Set bookNodes = xmlDoc.getElementsByTagName("book")

For i = 0 To bookNodes.length - 1
    WScript.Echo "Book Title: " & bookNodes.item(i).getAttribute("title")
Next

Set bookNodes = Nothing
Set xmlDoc = Nothing

脚本加载 XML 文件并检索所有 book 元素。然后,它使用 For 循环遍历 NodeList。对于每个节点,它会输出 title 属性的值。length 属性决定了循环的界限。

访问 NodeList 中的特定节点

此示例演示了如何通过索引访问 NodeList 中的特定节点。我们将同时演示直接访问和在访问前检查节点是否存在。当您需要特定节点而不是遍历所有节点时,这将非常有用。

specific_nodes.vbs
Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")
xmlDoc.async = False
xmlDoc.load("employees.xml")

If xmlDoc.parseError.errorCode <> 0 Then
    WScript.Echo "Error loading XML: " & xmlDoc.parseError.reason
    WScript.Quit
End If

Set empNodes = xmlDoc.getElementsByTagName("employee")

' Access first employee
If empNodes.length > 0 Then
    WScript.Echo "First employee: " & empNodes.item(0).text
End If

' Access third employee if exists
If empNodes.length >= 3 Then
    WScript.Echo "Third employee: " & empNodes.item(2).text
Else
    WScript.Echo "Third employee not found"
End If

Set empNodes = Nothing
Set xmlDoc = Nothing

脚本在访问特定索引之前会检查 NodeList 的长度。这可以防止尝试访问不存在的节点时出错。item 方法通过零基位置检索节点。在访问特定索引之前,请务必验证 NodeList 的长度。

修改 NodeList 中的节点

此示例演示了如何在 NodeList 中修改节点。由于 NodeList 是活动的,对节点的更改会立即反映在 XML 文档中。我们将更新所有匹配节点的属性值。

modify_nodes.vbs
Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")
xmlDoc.async = False
xmlDoc.load("products.xml")

If xmlDoc.parseError.errorCode <> 0 Then
    WScript.Echo "Error loading XML: " & xmlDoc.parseError.reason
    WScript.Quit
End If

Set productNodes = xmlDoc.getElementsByTagName("product")

For i = 0 To productNodes.length - 1
    productNodes.item(i).setAttribute "status", "active"
Next

' Save modified XML
xmlDoc.save "products_updated.xml"

Set productNodes = Nothing
Set xmlDoc = Nothing

脚本加载 XML 文件并检索所有 product 元素。然后,它遍历 NodeList 并更新每个产品的 status 属性。更改会立即反映在 NodeList 中并保存到新文件中。这演示了 NodeList 集合的活动性质。

过滤 NodeList 中的节点

虽然 NodeList 没有内置的过滤功能,但我们可以实现自定义过滤逻辑。此示例展示了如何仅处理满足特定标准的节点。我们将在遍历时检查属性值。

filter_nodes.vbs
Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")
xmlDoc.async = False
xmlDoc.load("orders.xml")

If xmlDoc.parseError.errorCode <> 0 Then
    WScript.Echo "Error loading XML: " & xmlDoc.parseError.reason
    WScript.Quit
End If

Set orderNodes = xmlDoc.getElementsByTagName("order")
WScript.Echo "Processing high-value orders:"

For i = 0 To orderNodes.length - 1
    Set order = orderNodes.item(i)
    amount = CDbl(order.getAttribute("amount"))
    
    If amount > 1000 Then
        WScript.Echo "Order ID: " & order.getAttribute("id") & _
                     ", Amount: $" & amount
    End If
Next

Set orderNodes = Nothing
Set xmlDoc = Nothing

脚本仅处理金额大于 1000 美元的订单。它演示了在使用 NodeList 时如何实现自定义过滤逻辑。在遍历过程中会检查每个节点的属性,以确定是否应该进行处理。这种模式对于选择性节点处理很有用。

将 NodeList 转换为数组

有时将 NodeList 转换为数组以方便处理会很有用。此示例展示了如何从 NodeList 创建数组。我们将保留数组中的节点引用,以便后续处理。

nodelist_to_array.vbs
Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")
xmlDoc.async = False
xmlDoc.load("customers.xml")

If xmlDoc.parseError.errorCode <> 0 Then
    WScript.Echo "Error loading XML: " & xmlDoc.parseError.reason
    WScript.Quit
End If

Set customerNodes = xmlDoc.getElementsByTagName("customer")

' Create array to hold nodes
Dim customerArray()
ReDim customerArray(customerNodes.length - 1)

' Populate array
For i = 0 To customerNodes.length - 1
    Set customerArray(i) = customerNodes.item(i)
Next

' Process array
For Each cust In customerArray
    WScript.Echo "Customer: " & cust.getAttribute("name")
Next

Set customerNodes = Nothing
Set xmlDoc = Nothing

脚本创建一个大小与 NodeList 长度匹配的数组。然后,它将每个节点引用复制到数组中。该数组可以独立于原始 NodeList 进行处理。当您需要使用静态节点集合时,此技术很有用。

来源

MSXML2.IXMLDOMNodeList 文档

在本文中,我们探讨了 VBScript 中的 MSXML2.IXMLDOMNodeList 对象,涵盖了其用法和实际应用。从基本遍历到高级过滤和转换技术,这些示例演示了有效的 XML 处理。通过这些知识,您可以增强 VBScript 应用程序的健壮 XML 处理能力。

作者

我叫 Jan Bodnar,是一名充满激情的程序员,拥有多年的编程经验。我自 2007 年以来一直在撰写编程文章。到目前为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面有八年以上的经验。

列出所有 VBScript 教程