2011-09-20 44 views
0

c.Valueは、シートの最初の行にあるセルからのテキストです(典型的な値は名前、型、重量、通貨ですが、何でも構いません)。vba - ノードのxpathを見つける

filenamesは、基本的にフォルダ内のXMLをループするDir()のループです。

これらのxmlは、(たとえば)最も低いレベルのノード 'weight'を持つことができますが、複数の異なる親ノードの下にあります。つまり、これらの3つの異なるxpath://クライアント/個人/重量と//クライアント/詳細/重みと//クライアント/詳細/情報/重み。

私はこのコードを持っている:私は何をしようとしている

Dim aDoc As DOMDocument 
    Dim aNode As IXMLDOMNode 
    Set aDoc = LoadXmlDoc(filenames(f)) 
    Set aNodes = aDoc.getElementsByTagName(c.Value) 
For f = 1 To UBound(filenames) 
    If aNodes.Length > 0 Then 'if at least one node is present 
     For Each aNode In aNodes 'loop thru each occurence of a node 
      c.Offset(f, 0).Value = aNode.Text & "parent is " & aNode.parentNode.parentNode 
     Next 
    End If 
Nxt f 

は、私がc.valueで指定した子ノードのためのXPathの明確なリストを取得することです。例えば

if c.value is weight 

私は戻って、このリストを取得しようとしている:

//Client/personal/weight 
//Client/details/weight 
//Client/details/info/weight. 

http://msdn.microsoft.com/en-us/library/aa163921(office.10).aspxは良い参考ですが、私はからのxpathを取得する方法を見つけるように見えることはできません子ノード私はちょうどすぐに親ノードを取得することができました。

答えて

1

ノードから始め、文書レベルに達するまで親を歩いていく必要があります。

Sub Tester() 

    Dim oDoc As New MSXML2.DOMDocument 
    Dim oNodes As MSXML2.IXMLDOMNodeList 
    Dim oNode As MSXML2.IXMLDOMNode 
    Dim pNode As MSXML2.IXMLDOMNode 
    Dim XML As String, sPath As String 

    XML = "<Client><LastName>Bill</LastName><FirstName>Gates</FirstName>" & _ 
    "<MiddleName/><Suffix/><DateOfBirth>30-May-1968</DateOfBirth>" & _ 
    "<PlaceOfBirth/><SSN>n/a</SSN><Gender>Male</Gender><District>" & _ 
    "<City>SHELTON</City><Mayor>wong</Mayor></District><State>WA</State>" & _ 
    "<Zip>96484</Zip></Client>" 

    oDoc.LoadXML XML 

    Set oNodes = oDoc.getElementsByTagName("City") 
    If oNodes.Length > 0 Then 

     For Each oNode In oNodes 
      sPath = oNode.nodeName 
      Set pNode = Nothing 
      Do 
       If pNode Is Nothing Then 
        Set pNode = oNode.ParentNode 
       Else 
        Set pNode = pNode.ParentNode 
       End If 

       If pNode.nodeTypeString <> "document" Then 
        sPath = pNode.nodeName & "/" & sPath 
       Else 
        sPath = "//" & sPath 
        Exit Do 
       End If 
      Loop 
      Debug.Print sPath 
     Next oNode 
    End If 

End Sub 
関連する問題