Excel VBA XPath表达式错误 - 预期令牌')'发现':'

时间:2014-09-24 07:06:58

标签: xml excel vba xpath

目前,我正在使用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/.)]")

1 个答案:

答案 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"