2014-09-24 50 views
0

目前我正在使用Xpath表達式從Excel VBA代碼中的XML文檔中檢索一些數據。我的目標是從XML中檢索唯一的ID。這是我嘗試的xpath表達式。Excel VBA XPath表達式錯誤 - 期望的標記')'找到':'

//u:UserID[not(. = following::u:UserID/.)] 

我試着使用記事本++ xml插件的Xpath,它完美的工作。但是,這不適用於MS-EXCEL VBA中的MSXML文檔,並引發以下錯誤。

Expected token ')' found ':'. 

根據this post這說明Martin Honnen是因爲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/.)]") 
+2

您的XPath似乎並不使用XPath 2.0的特定功能,我懷疑這只是一個使用命名空間前綴的問題('U:')。也許在這個XPath周圍發佈一些相關的VBA代碼可以幫助我們進一步診斷問題 – har07 2014-09-24 07:33:19

+0

XPath 1.0中的路徑表達式很好。你能發佈你的代碼嗎? – 2014-09-24 07:33:53

+1

這可能是VBA中的XPath引擎無法識別'following ::'軸。這會讓我感到驚訝,但是如果你刪除了'following ::'部分,看看它是否仍然顯示錯誤。 – JLRishe 2014-09-24 08:01:26

回答

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" 
相關問題