代码之家  ›  专栏  ›  技术社区  ›  René Nyffenegger

使用selectSingleNode选择节点后,如何迭代节点的子节点

  •  1
  • René Nyffenegger  · 技术社区  · 6 年前

    selectSingleNode() 然后使用 selectNodes

    option explicit
    
    sub main() ' {
    
       dim doc as new MSXML2.DOMDocument
    
       doc.loadXML(                                                                                     _
         "<items>"                                                                                    & _
         "  <item id='1000'><name val='ABC'/><name val='DEF'/><name val='GHI'/><foo>xxx</foo></item>" & _
         "  <item id='1001'><name val='JKL'/><name val='MNO'/><name val='PQR'/><bar>yyy</bar></item>" & _
         "  <item id='1002'><name val='STU'/><name val='VWX'/><name val='YZ.'/><baz>zzz</baz></item>" & _
         "</items>")
    
        dim item as msxml2.IXMLDOMElement
        set item = doc.selectSingleNode("//item[@id='1002']")
    
        dim names as msxml2.IXMLDOMSelection
        set names = item.selectNodes("//name")
    
        dim name as msxml2.IXMLDOMElement
        for each name in names
            debug.print(name.getAttribute("val"))
        next name
    
    end sub ' }
    

    我希望这段代码能够打印属性值 STU , VWX YZ. . 但是,在运行它时,它会打印每个 <name> val

    显然地 selectNodes() 从根文档中选择所有节点。

    我不明白为什么会这样,我怎么才能得到 真实的

    2 回复  |  直到 6 年前
        1
  •  2
  •   Santosh    6 年前

    改变

    Set names = item.selectNodes("//name")
    

    Set names = item.SelectNodes("name")
    
        2
  •  0
  •   QHarr    6 年前

    您希望迭代下面显示的xpath返回的选择。它本质上是一个包含属性节点的节点集。

    Option Explicit
    Public Sub main()
       Dim doc As New MSXML2.DOMDocument60
    
       doc.LoadXML ( _
         "<items>" & _
         "  <item id='1000'><name val='ABC'/><name val='DEF'/><name val='GHI'/><foo>xxx</foo></item>" & _
         "  <item id='1001'><name val='JKL'/><name val='MNO'/><name val='PQR'/><bar>yyy</bar></item>" & _
         "  <item id='1002'><name val='STU'/><name val='VWX'/><name val='YZ.'/><baz>zzz</baz></item>" & _
         "</items>")
    
        Dim items As IXMLDOMSelection, item As Object
        Set items = doc.SelectNodes("//*[@id='1002']/name/@*") 'all attribs. Or, //*[@id='1002']/name/@val for only val attributes
        For Each item In items
            Debug.Print item.text
        Next
    End Sub
    

    如果您想要更详细的方法

    Option Explicit
    Public Sub main()
        Dim doc As New MSXML2.DOMDocument60
    
        doc.LoadXML ( _
                    "<items>" & _
                    "  <item id='1000'><name val='ABC'/><name val='DEF'/><name val='GHI'/><foo>xxx</foo></item>" & _
                    "  <item id='1001'><name val='JKL'/><name val='MNO'/><name val='PQR'/><bar>yyy</bar></item>" & _
                    "  <item id='1002'><name val='STU'/><name val='VWX'/><name val='YZ.'/><baz>zzz</baz></item>" & _
                    "</items>")
    
        Dim item As Object, attrib As Object, child As Object
        Set item = doc.SelectSingleNode("//*[@id='1002']")
    
        For Each child In item.ChildNodes
            For Each attrib In child.Attributes
                If attrib.name = "val" Then Debug.Print attrib.name, attrib.text
            Next
        Next
    End Sub
    

    For Each child In item.ChildNodes
        If child.BaseName = "name" And child.getAttribute("val") <> vbNullString Then Debug.Print child.getAttribute("val")
    Next