我试图在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); '未知方法
答案 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.0
。
Microsoft XML, v3.0
(MSXML2.DOMDocument30
)不适合。
如果属性值总是大写,那么
Set el = oDoc.SelectSingleNode("/GetUserInfo/User[@Name='" & UCase(sName) & "']")
也适合。
答案 1 :(得分:1)
你应该可以使用小写的功能来匹配它,但是属性的名称区分大小写,所以你需要@Name而不是@name。
Set el = oDoc.SelectSingleNode("/GetUserInfo/User[lower-case(@Name)='" & Name & "']")