如何找到包含子字符串的节点?

How can I find a node containing a sub-string?

我可以使用以下语句在 XML 文件中找到节点:

Set user = objXMLDoc.selectSingleNode("//user[@id = '" & id & "']")

但我正在阅读的 XML 文件是自动生成的,有时在 ID 后包含 spaces。 user 节点的 id 属性可能如下所示:

<user id="E12345" name="Dan Smith">
<user id="E12345 " name="Dan Smith">

目前这似乎是数据中唯一的变化。我无法控制文件的生成,也无法在那一端强制使用 TRIM。所以我必须在我的代码中处理。

解决此问题的最简单方法是什么?我可以使用某种 InStr 方法吗?

目前我正在围绕它进行编码,但这感觉很笨拙并且只在有一个额外的时候处理异常 space:

Set user = objXMLDoc.selectSingleNode("//user[@id = '" & id & "']")
If user Is Nothing Then 
    Set user = objXMLDoc.selectSingleNode("//user[@id = '" & id & " ']")
End If

您可以使用 contains():

Set user = objXMLDoc.selectSingleNode("//user[contains(@id,'" & id & "')]")

或者如果空格只出现在字符串的末尾,您可以使用 starts-with():

Set user = objXMLDoc.selectSingleNode("//user[starts-with(@id,'" & id & "')]")

使用 normalize-space() 函数删除 leading/trailing 空格:

xpath = "//user[normalize-space(@id) = '" & id & "']"
Set user = objXMLDoc.selectSingleNode(xpath)

请注意,您需要使用 XML 库的版本 6 才能正常工作:

Set objXMLDoc = CreateObject("Msxml2.DOMDocument.6.0")

早期版本不提供此方法,所以你会得到一个"unknown method"错误:

Unknown method.

//user[-->normalize-space(@<--id)='E12345'] (0x80004005)