VBA 上的 xpath 中不区分大小写的匹配?
case-insensitive matching in xpath on VBA?
我正在尝试获取 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); '未知方法
您应该可以像您尝试的那样使用小写函数匹配它,但是属性的名称区分大小写,因此您需要@Name 而不是@name。
Set el = oDoc.SelectSingleNode("/GetUserInfo/User[lower-case(@Name)='" & Name & "']")
由于 XPATH 2.0
函数不可用,因为 MSXML
不支持 XPath 2.0 *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.0
。
Microsoft XML, v3.0
(MSXML2.DOMDocument30
) 不适合。
如果属性值总是大写,则
Set el = oDoc.SelectSingleNode("/GetUserInfo/User[@Name='" & UCase(sName) & "']")
也适合。
我正在尝试获取 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); '未知方法
您应该可以像您尝试的那样使用小写函数匹配它,但是属性的名称区分大小写,因此您需要@Name 而不是@name。
Set el = oDoc.SelectSingleNode("/GetUserInfo/User[lower-case(@Name)='" & Name & "']")
由于 XPATH 2.0
函数不可用,因为 MSXML
不支持 XPath 2.0 *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.0
。
Microsoft XML, v3.0
(MSXML2.DOMDocument30
) 不适合。
如果属性值总是大写,则
Set el = oDoc.SelectSingleNode("/GetUserInfo/User[@Name='" & UCase(sName) & "']")
也适合。