VBA上的xpath中不区分大小写的匹配?

时间:2016-12-19 10:14:07

标签: xml excel vba excel-vba case-insensitive

我试图在VBA中获取单个节点的属性,但是当我希望它不区分大小写

时,无法使用DOM来管理它

VBA:

Dim oDoc As New MSXML2.DOMDocument30
Dim el As Object
Dim XML As String

XML =("C:\........")

oDoc.validateOnParse = True
oDoc.Load XML  


dim Name as String
Name= "yaron"


  'select the User node with Name="Yaron"
    Set el = oDoc.SelectSingleNode("/GetUserInfo/User[@Name='" & Name & "']")
   'Set el = oDoc.SelectSingleNode("/GetUserInfo/User[matches(@Name, 'Name ' ,'i')]")    
   'Set el = oDoc.SelectSingleNode("/GetUserInfo/User[lower-case(@Name)='" & Name & "']")


    If Not el Is Nothing Then
    Debug.Print el.getAttribute("LoginName")
Else
    Debug.Print "user id not found!"
End If

XML:

  <GetUserInfo>
           <User ID="16" Name="DAVID" LoginName="login1"/>
           <User ID="17" Name="GAL" LoginName="login2"/>
           <User ID="18" Name="YARON" LoginName="login3"/>
  </GetUserInfo>

评论中有2行评论我在此网站播种解决方案后尝试的两种不同方式, 但显然这些解决方案不适用于** VBA - ** Excel **** 我得到运行时错误'-2147467259(80004005); '未知方法

2 个答案:

答案 0 :(得分:2)

由于XPATH 2.0不支持XPath 2.0 MSXML,因此*grr*函数不可用,因此使用translate函数对比较属性内容不区分大小写的唯一可能性。

    Dim oDoc As New MSXML2.DOMDocument60
...
    Set el = oDoc.SelectSingleNode("/GetUserInfo/User[translate(@Name, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')='" & UCase(sName) & "']")

这至少需要Microsoft XML, v4.0,更好Microsoft XML, v6.0Microsoft XML, v3.0MSXML2.DOMDocument30)不适合。

如果属性值总是大写,那么

Set el = oDoc.SelectSingleNode("/GetUserInfo/User[@Name='" & UCase(sName) & "']")

也适合。

答案 1 :(得分:1)

你应该可以使用小写的功能来匹配它,但是属性的名称区分大小写,所以你需要@Name而不是@name。

Set el = oDoc.SelectSingleNode("/GetUserInfo/User[lower-case(@Name)='" & Name & "']")