VBA中用MSXML2获取XML节点自身文本而非子节点文本的方法
在VBA中使用MSXML2获取XML节点自身的文本内容
问题原因
MSXML2里节点的Text属性是DOM规范定义的默认行为:它会自动串联当前节点及其所有后代节点的文本内容,这就是你获取父节点(如/partsmanagement、/partsmanagement/part)时,得到所有子节点文本拼接结果的原因。
解决方案
要仅获取节点自身直接包含的文本(即该节点的直接子节点中的文本节点内容),可以通过两种方式实现:
方法1:自定义函数遍历直接子节点
编写函数遍历目标节点的直接子节点,仅筛选出类型为NODE_TEXT(节点类型值为3)的节点,拼接它们的内容:
' 需提前引用MSXML库(如Microsoft XML, v6.0) Function GetNodeOwnText(node As IXMLDOMNode) As String Dim childNode As IXMLDOMNode Dim ownText As String ownText = "" ' 遍历节点的直接子节点 For Each childNode In node.childNodes ' 仅处理文本节点 If childNode.nodeType = NODE_TEXT Then ownText = ownText & childNode.nodeValue End If Next childNode ' 可选:去除首尾空白字符(根据需求选择) ' GetNodeOwnText = Trim(ownText) GetNodeOwnText = ownText End Function
使用示例
Dim xml As MSXML2.DOMDocument60 Set xml = New MSXML2.DOMDocument60 xml.LoadXML "你的XML内容" ' 或从文件加载 ' 获取/partsmanagement的自身文本(返回空字符串) Debug.Print GetNodeOwnText(xml.selectNodes("/partsmanagement").Item(0)) ' 获取/partsmanagement/part的自身文本(Trim后返回纯text0) Debug.Print Trim(GetNodeOwnText(xml.selectNodes("/partsmanagement/part").Item(0)))
方法2:用XPath直接选择文本节点
通过XPath的text()语法,直接选中目标节点的所有直接文本子节点,再拼接内容:
Dim xml As MSXML2.DOMDocument60 Set xml = New MSXML2.DOMDocument60 xml.LoadXML "你的XML内容" ' 获取/partsmanagement的自身文本 Dim textNodes As IXMLDOMNodeList Set textNodes = xml.selectNodes("/partsmanagement/text()") If textNodes.Length > 0 Then Debug.Print textNodes.Item(0).nodeValue Else Debug.Print "" ' 无文本节点时返回空字符串 End If ' 获取/partsmanagement/part的自身文本 Set textNodes = xml.selectNodes("/partsmanagement/part/text()") Dim partText As String partText = "" For Each childNode In textNodes partText = partText & childNode.nodeValue Next childNode Debug.Print Trim(partText) ' 输出纯text0
关键说明
- 节点的
Text属性是DOM标准行为,并非MSXML特有问题 - 若目标节点的直接文本节点包含多个(比如换行、空格分隔的文本),两种方法都会拼接所有直接文本节点的内容,按需用
Trim()或其他字符串处理函数清理格式
内容的提问来源于stack exchange,提问作者user23025019
相关产品推荐
相关产品推荐

