目前,我正在使用Xpath表达式从Excel VBA代码中的XML文档中检索一些数据。我的目标是从XML中检索唯一ID。这是我试过的xpath表达式。
//u:UserID[not(. = following::u:UserID/.)]
我使用Notepad ++ xml插件尝试了Xpath,它运行得很好。但是,这不适用于MS-EXCEL VBA中的MSXML文档,并且会抛出错误。
Expected token ')' found ':'.
根据Martin Honnen中描述的this post,这是因为XPath 2.0功能在Microsoft XSLT处理器中不支持。
有人可以指导我如何将上述Xpath表达式从XPath 2.0转换为XPath 1.0吗?
提前致谢, Prasaz
请在下面找到示例代码。
示例XML:
<u:root name="user" xmlns:u="http://example.com/user">
<u:Transactions>
<u:Transaction>
<u:TransactionID>1</u:TransactionID>
<u:FUser>
<u:UserTypeID>270</u:UserTypeID>
<u:UserID>67</u:UserID>
<u:Username>User67</u:Username>
</u:FUser>
<u:TUser>
<u:UserTypeID>202</u:UserTypeID>
<u:UserID>16</u:UserID>
<u:Username>User16</u:Username>
</u:TUser>
</u:Transaction>
<u:Transaction>
<u:TransactionID>2</u:TransactionID>
<u:FUser>
<u:UserTypeID>267</u:UserTypeID>
<u:UserID>64</u:UserID>
<u:Username>User64</u:Username>
</u:FUser>
<u:TUser>
<u:UserTypeID>202</u:UserTypeID>
<u:UserID>16</u:UserID>
<u:Username>User16</u:Username>
</u:TUser>
</u:Transaction>
</u:Transactions>
样本VBA
Private userXMLDocument As DOMDocument
Set userXMLDocument= New DOMDocument
// Code loading data data to the userXMLDocument
// Once done,
Dim xmlNodeList As MSXML2.IXMLDOMNodeList
//Next line generates the error
Set xmlNodeList = userXMLDocument.SelectNodes("//u:UserID[not(.= following::u:UserID/.)]")
答案 0 :(得分:0)
谢谢你的帮助。
最后设法解决它。问题在于userXMLDocument对象选择语言属性。我将其设置为XSLPattern
后设置为XPATH
而不是XPATH
我还有另一个问题,即它无法识别命名空间前缀(u:
)。然后正如JLRishe所提到的,我需要使用selectionNamespaces
属性传递正确的命名空间。
请参阅下面的代码供您参考
Private userXMLDocument As DOMDocument
Set userXMLDocument= New DOMDocument
Dim xmlNameSpaces As String
xmlNameSpaces = "valid xml namespace"
userXMLDocument.LoadXML(xmlFilePath)
userXMLDocument.setProperty "SelectionLanguage", "XPath"
userXMLDocument.setProperty "SelectionNamespaces", xmlNameSpaces
Dim xmlNodeList As MSXML2.IXMLDOMNodeList
Set xmlNodeList = userXMLDocument.SelectNodes("//u:UserID[not(. = following::u:UserID/.)]")
MsgBox xmlNodeList.Length, vbInformation, "Node Count"