2016-05-31 420 views
-1

我試圖從本質上使用VBA獲取下面的XML中的「Rate」值(這是一個大大縮短的版本,實際上有500多個費率可供選擇)。我很努力地達到它,而不必在每個節點上循環,直到達到正確的節點。用Excel VBA讀取XML

-<DC> 
- <Overviews> 
     - <OverviewCurve> 
     <Identifier>zero_libor_usd</Identifier> 
     - <Curve> 
      - <YieldCurve> 
       - <Node> 
        <Term>32</Term> 
        <Rate>0.027613082673910938</Rate> 
       </Node> 
      </YieldCurve> 
      </Curve> 
     </OverviewCurve> 
</Overviews> 
</DC> 

我嘗試使用的代碼是..

Set xmldoc = New MSXML2.DOMDocument60 
xmldoc.async = False 
xmldoc.Load (Range("Path").Value & Range("FileName").Value) 
Set xmlNode2 =xmldoc.SelectSingleNode("/DC/Overviews/OverviewCurve/Identifier/Curve/YieldCurve/Node/Rate") 

但代碼返回 「無」 的xmlNode2。 xml文件本身基本上有5個其他的「OverviewCurve」節點,所有節點都以50個「速率」節點(即50個「節點」節點)以相同的方式結構化。我試圖從文件中獲取這些文件。我已經刪除了一些其他節點,這些節點是「Overviews」節點的子節點,因爲它們與我試圖提取的內容無關。

回答

0

如果有多個Rate節點,那麼XPATH 「/ DC /概述/ OverviewCurve /標識符/曲線/ YieldCurve /節點/價格」 將不會是一個SingleNode

Dim xmlDoc As MSXML2.DOMDocument60 
Dim xmlNode As MSXML2.IXMLDOMNode 
Dim xmlNodeList As MSXML2.IXMLDOMNodeList 

Set xmlDoc = New MSXML2.DOMDocument60 
xmlDoc.async = False 
xmlDoc.Load "P:\test.xml" 

Set xmlNode = xmlDoc.SelectSingleNode("//Rate[1]") 'xmlNode is now the first Rate 

Set xmlNodeList = xmlDoc.SelectNodes("//Rate") 'xmlNodeList is now a list of all Rate nodes 

語法XPATH看到https://en.wikipedia.org/wiki/XPath