2016-06-09 64 views
0

我想知道,如果有可能選擇所有孫輩的所有節點,沒有他們的父節點。只有XML-VBA SelectNodes孫輩(沒有父節點)

<shelf> 
    <book name="Moby Dick"> 
    <price>4.50$</price> 
    </book> 
    <book name="Hamlet"> 
    <price>5$</price> 
    </book> 
    <book name="Faust"> 
    <price>12$</price> 
    </book> 
</shelf> 

在這個例子中,我想要一個價格列表。我的問題是我需要從「貨架」軸訪問它們。

我試了下面的代碼,沒有成功。

Set xmlPrices = xmlDoc.SelectNodes("/shelf/book//price") 

所以我想要一個只有價格的節點列表。

<price>4.50$</price> 
<price>5$</price> 
<price>12$</price> 

感謝您的幫助。

+0

目前尚不清楚你想要達到的目標。你說你想要一個價格列表,我想'xmlDoc.SelectNodes(「/ shelf/book // price」)'會給你一個包含'price'元素的節點列表。然後你顯示價格值列表,例如'4.50 $'。那麼究竟是什麼問題,從像' 4.50 $'這樣的元素中提取像'4.50 $'這樣的值? MSXML DOM中的'text'屬性應該允許。 –

+0

是的,你是對的。我想要一個帶有'price'元素的節點列表。我稍後將價格寫入Excel表格。但'xmlDoc.SelectNodes(「/ shelf/book // price」)似乎不能正常工作。我編輯了原文。 – LordGhettofaust

+0

如果您在xmlDoc.SelectNodes(「/ shelf/book/price」)中使用'For Each Price:將Price.xml存儲在您的表中:Next',那麼我認爲您的代碼應該可以工作。 –

回答

0

嘗試XML Linq。我使代碼非常強大,以處理大多數問題。

Imports System.Xml 
Imports System.Xml.Linq 
Module Module1 
    Const FILENAME As String = "c:\temp\test.xml" 
    Sub Main() 
     Dim doc As XDocument = XDocument.Load(FILENAME) 

     Dim prices() As Decimal = doc.Descendants().Where(Function(x) x.Name.LocalName = "price").Select(Function(y) Decimal.Parse(CType(y, String).Replace("$", ""))).ToArray() 
    End Sub 

End Module 
+0

我需要一些時間來測試和實施它。謝謝你到目前爲止。 – LordGhettofaust

0

我覺得你的XPath查詢是好的 - 這裏有一個工作示例:

Option Explicit 

Sub Test() 

    Dim strXml As String 
    Dim objXmlParser As New MSXML2.DOMDocument60 
    Dim strXPath As String 
    Dim intCounter As Integer 
    Dim objXmlNodes As IXMLDOMNodeList 
    Dim strNodeValue As String 

    'sample xml 
    strXml = "" 
    strXml = strXml & "<shelf>" 
    strXml = strXml & "<book name=""Moby Dick""><price>4.50$</price></book>" 
    strXml = strXml & "<book name=""Hamlet""><price>5$</price></book>" 
    strXml = strXml & "<book name=""Faust""><price>12$</price></book>" 
    strXml = strXml & "</shelf>" 

    'load to parser 
    objXmlParser.LoadXML strXml 

    'query document with XPath 
    strXPath = "/shelf/book//price" 
    Set objXmlNodes = objXmlParser.SelectNodes(strXPath) 

    'iterate output nodes and access properties 
    For intCounter = 0 To objXmlNodes.Length - 1 
     strNodeValue = objXmlNodes.Item(intCounter).Text 
     Debug.Print strNodeValue 
    Next intCounter 

End Sub