ZetCode

VBScript CloneNode 方法

最后修改于 2025 年 4 月 9 日

VBScript 中的 CloneNode 方法是 XML DOM (文档对象模型) 的一部分。它会创建一个 XML 文档中指定节点的副本。此方法对于 VBScript 中的 XML 操作和文档处理至关重要。它允许复制节点,并可以选择性地包含子节点。

CloneNode 提供了对节点执行深拷贝或浅拷贝的控制。理解此方法对于高级 XML 处理至关重要。本教程将通过实际示例介绍 CloneNode,以演示其在各种场景下的用法。

CloneNode 方法概述

CloneNode 方法接受一个参数:一个布尔值,指示是否克隆所有子节点。如果为 true,则执行深拷贝,包括所有后代节点。如果为 false,则仅克隆节点本身。

主要功能包括保留节点属性和命名空间信息。该方法返回一个与原始节点相同的新节点对象。克隆的节点最初不属于任何文档树。它们必须显式插入到文档结构中。

基本节点克隆

此示例演示了 CloneNode 的最简单用法,即创建 XML 元素的副本。它同时展示了浅拷贝和深拷贝操作。将检查生成的节点以显示差异。

basic_clonenode.vbs
Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.async = False
xmlDoc.loadXML "<book><title>Learning VBScript;<title></book>"

Set originalNode = xmlDoc.documentElement
Set shallowCopy = originalNode.cloneNode(False)
Set deepCopy = originalNode.cloneNode(True)

WScript.Echo "Shallow copy XML: " & shallowCopy.xml
WScript.Echo "Deep copy XML: " & deepCopy.xml

Set xmlDoc = Nothing

脚本创建一个 XML 文档并克隆其根元素。浅拷贝仅包含 book 元素,不包含子节点。深拷贝则同时包含 book 元素及其 title 子节点。

克隆带属性的节点

此示例展示了 CloneNode 在克隆过程中如何处理元素属性。无论是浅拷贝还是深拷贝,都会保留原始节点的所有属性。克隆节点中的属性值保持不变。

cloning_attributes.vbs
Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.async = False
xmlDoc.loadXML "<book id='101' category='Programming'></book>"

Set bookNode = xmlDoc.documentElement
Set clonedNode = bookNode.cloneNode(True)

WScript.Echo "Original attributes: " & bookNode.xml
WScript.Echo "Cloned attributes: " & clonedNode.xml

Set xmlDoc = Nothing

脚本克隆了一个带有两个属性的 book 元素。克隆的节点包含相同的属性值。这表明属性信息保留与 deep 参数的值无关。

插入克隆的节点

此示例演示了如何克隆节点并将其重新插入到文档中。它展示了从克隆到文档修改的完整流程。克隆的节点成为文档结构的一部分。

inserting_clones.vbs
Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.async = False
xmlDoc.loadXML "<library><book>Title 1</book></library>"

Set library = xmlDoc.documentElement
Set firstBook = library.firstChild
Set clonedBook = firstBook.cloneNode(True)

library.appendChild clonedBook
WScript.Echo "Modified XML: " & xmlDoc.xml

Set xmlDoc = Nothing

脚本克隆了一个 book 节点并将其追加到 library。生成的 XML 包含两个相同的 book 元素。这种模式对于在 XML 文档中复制模板节点非常有用。

克隆不同类型的节点

CloneNode 除了元素节点外,还可以用于各种 XML 节点类型。此示例演示了克隆文本节点和注释节点。每种节点类型在克隆时的行为略有不同。

node_types.vbs
Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.async = False
xmlDoc.loadXML "<root><!-- Comment -->Text node</root>"

Set comment = xmlDoc.documentElement.firstChild
Set textNode = xmlDoc.documentElement.lastChild

Set clonedComment = comment.cloneNode(True)
Set clonedText = textNode.cloneNode(True)

WScript.Echo "Cloned comment: " & clonedComment.xml
WScript.Echo "Cloned text: " & clonedText.xml

Set xmlDoc = Nothing

脚本从 XML 文档中克隆了一个注释节点和一个文本节点。两个克隆节点都保留了它们原来的内容。这表明 CloneNode 在不同节点类型之间具有通用性。

克隆带命名空间的节点

这个高级示例展示了 CloneNode 如何处理带命名空间的 XML 元素。命名空间声明和前缀在克隆的节点中得到保留。该示例使用了一个带有命名空间定义的文档。

namespaces.vbs
Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.async = False
xmlDoc.loadXML "<ns:book xmlns:ns='http://example.com'/>"

Set bookNode = xmlDoc.documentElement
Set clonedNode = bookNode.cloneNode(True)

WScript.Echo "Cloned namespaced node: " & clonedNode.xml

Set xmlDoc = Nothing

脚本克隆了一个带命名空间的 XML 元素。克隆的节点保留了原始的命名空间声明。此行为对于使用命名空间处理复杂的 XML 文档至关重要。

来源

XML DOM 文档

在本文中,我们探讨了 VBScript 中的 CloneNode 方法,涵盖了其用法和实际应用。从简单的节点复制到复杂的命名空间处理,这些示例展示了可靠的 XML 节点克隆。通过这些知识,您可以增强 XML 处理脚本的功能,使其具备强大的节点操作能力。

作者

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

列出所有 VBScript 教程