Microsoft Excel

Herbers Excel/VBA-Archiv

xml: alle child nodes eines parent nodes auslesen


Betrifft: xml: alle child nodes eines parent nodes auslesen von: René
Geschrieben am: 19.07.2018 12:41:22

Hallo zusammen,
wie kann man per VBA in einem xml file alle untergeordneten Knoten eines Unterknotens auslesen?
Wenn man voraussetzt, dass man bereits weiß, dass man sich im Unterknoten 1B befindet, wie erhält man die Namen der Knoten Unterknoten 2B1 u. Unterknoten 2B2 sowie deren Text (2B1A, 2B1B) (s.u.)

Bsp. Struktur des xml files:

Hauptknoten: SektionA
Unterknoten 1A: Kunde1
Unterknoten 2A1: LandA
Unterknoten 2A2: LandB
Unterknoten 1B: Kunde2
Unterknoten 2B1: LandC
Text 2B1A: PreisX
Text 2B1B: GrößeY
Unterknoten 2B2: LandD
usw.

Gruß
René

  

Betrifft: AW: xml: alle child nodes eines parent nodes auslesen von: PeterK
Geschrieben am: 19.07.2018 12:52:50

Hallo

Excel kann XML importieren (DATEN - AUS ANDERER QUELLE - XML DATENIMPORT)


  

Betrifft: AW: xml: alle child nodes eines parent nodes auslesen von: René
Geschrieben am: 19.07.2018 13:21:37

Danke für die Info.
Die Knoten sollen per VBA direkt aus dem xml file ausgelesen werden, quasi für den User nicht sichtbar.


  

Betrifft: AW: xml: alle child nodes eines parent nodes auslesen von: PeterK
Geschrieben am: 19.07.2018 13:48:09

Hallo

Hab folgenden Code auf https://stackoverflow.com/questions/11305/how-to-parse-xml-using-vba gefunden und etwas modifiziert. Du musst in EXTRAS-VERWEISE-MICROSOFT XML V6.0 aktivieren.


Option Explicit

Public Sub LoadDocument()
    
    Dim xDoc As MSXML2.DOMDocument60
    Set xDoc = New MSXML2.DOMDocument60
    
    xDoc.validateOnParse = False

    If xDoc.Load("C:\Users\ich\Documents\test.xml") Then
        ' The document loaded successfully.
        ' Now do something intersting.
        DisplayNode xDoc.ChildNodes, 0
    Else
        ' The document failed to load.
        ' See the previous listing for error information.
    End If
End Sub

Public Sub DisplayNode(ByRef Nodes As MSXML2.IXMLDOMNodeList, _
                       ByVal Indent As Integer)

    Dim xNode As MSXML2.IXMLDOMNode
    Indent = Indent + 2

    For Each xNode In Nodes
        If xNode.NodeType = NODE_TEXT Then
            Debug.Print Space$(Indent) & xNode.ParentNode.nodeName & _
                        ":" & xNode.NodeValue
        End If

        If xNode.HasChildNodes Then
            DisplayNode xNode.ChildNodes, Indent
        End If
    Next xNode
End Sub





  

Betrifft: AW: xml: alle child nodes eines parent nodes auslesen von: René
Geschrieben am: 19.07.2018 14:09:55

wow, das sieht schon mal richtig gut.
vielen Dank dafür.
kann ich die Prozedur auch stoppen, wenn ich die Unterknoten nur des 1. Unterknoten (zum Hauptknoten) auslesen möchte?
Die Namen der Unterknoten der 2. Ebene möchte ich nämlich den Usern in einer UserForm zur Verfügung stellen.
Davon können sie dann wieder einen Auswählen und folglich wird der Inhalt des Knotens der 2. Ebene zur Verfügung gestellt.


  

Betrifft: AW: xml: alle child nodes eines parent nodes auslesen von: PeterK
Geschrieben am: 19.07.2018 14:16:00

Hallo

Kannst Du Deine XML Datei hochladen, damit ich auch sehen kann was Du genau vorhast


  

Betrifft: AW: xml: alle child nodes eines parent nodes auslesen von: René
Geschrieben am: 19.07.2018 14:34:07

Klar, sehr gerne. anbei das Bsp.
Wenn der User den Knoten "Customer_Deutschland" (über einen UserForm Dialog) auswähl benötige ich die Rückmeldung welche "Kd_ID_..." Knoten darunter enthalten sind.
Sollte der User im folgenden Dialog zB den Unterknoten "Kd_ID_Test7" ausgewählt haben, so müsste ich "Geschäft, Land, ID u. Anzahl_Kunden" auslesen können.

https://www.herber.de/bbs/user/122791.zip


  

Betrifft: AW: xml: alle child nodes eines parent nodes auslesen von: René
Geschrieben am: 19.07.2018 14:34:12

Klar, sehr gerne. anbei das Bsp.
Wenn der User den Knoten "Customer_Deutschland" (über einen UserForm Dialog) auswähl benötige ich die Rückmeldung welche "Kd_ID_..." Knoten darunter enthalten sind.
Sollte der User im folgenden Dialog zB den Unterknoten "Kd_ID_Test7" ausgewählt haben, so müsste ich "Geschäft, Land, ID u. Anzahl_Kunden" auslesen können.

https://www.herber.de/bbs/user/122791.zip


  

Betrifft: AW: xml: alle child nodes eines parent nodes auslesen von: PeterK
Geschrieben am: 19.07.2018 15:21:09

Hallo

Könnte in etwa so ausschauen


Option Explicit

Dim xDoc As MSXML2.DOMDocument60

Public Sub LoadDocument()
    
    Set xDoc = New MSXML2.DOMDocument60
    
    xDoc.validateOnParse = True

    If xDoc.Load("C:\Users\ich\Downloads\child_nodes_of_parent_node.xml") Then
        ' The document loaded successfully.
    Else
        ' The document failed to load.
    End If
End Sub


Sub GetKD_ID(myCustomer As String)

    Dim oSeqNodes As IXMLDOMNodeList
    Dim oSeqNode As IXMLDOMNode
    Dim oSeqChild As IXMLDOMNode
    
    Set oSeqNodes = xDoc.SelectNodes("//BrandData/" & myCustomer)

    If oSeqNodes.Length = 0 Then
        'show some message
    Else
        For Each oSeqNode In oSeqNodes
            For Each oSeqChild In oSeqNode.ChildNodes
              Debug.Print oSeqChild.nodeName
            Next
        Next
    End If
End Sub

Sub GetKD_ID_Info(myCustomer As String, myK_ID As String)

    Dim oSeqNodes As IXMLDOMNodeList
    Dim oSeqNode As IXMLDOMNode
    Dim oSeqChild As IXMLDOMNode
    
    Set oSeqNodes = xDoc.SelectNodes("//BrandData/" & myCustomer & "/" & myK_ID)

    If oSeqNodes.Length = 0 Then
        'show some message
    Else
        For Each oSeqNode In oSeqNodes
            For Each oSeqChild In oSeqNode.ChildNodes
              Debug.Print oSeqChild.nodeName, ":", oSeqChild.Text
            Next
        Next
    End If
End Sub

Sub Finish()
  Set xDoc = Nothing
End Sub

Sub RunXml()
    LoadDocument
    GetKD_ID "Customer_Deutschland"
    GetKD_ID_Info "Customer_Deutschland", "Kd_ID_Test8"
    Finish
End Sub




  

Betrifft: AW: xml: alle child nodes eines parent nodes auslesen von: René
Geschrieben am: 20.07.2018 07:45:29

VIELEN DANK für die sehr schnelle und perfekte Unterstützung!!
Das ist genau was ich benötige. Mit ein paar wenigen Anpassungen konnte ich den Code nahezu exakt übernehmen. Traumhaft!

Vlt. noch eine Frage: wissen Sie, ob es online ein gutes Tutorial zum Thema Excel-VBA-XML gibt, in dem man solche Inhalte wie von Ihnen geschrieben nachlesen kann?


  

Betrifft: AW: xml: alle child nodes eines parent nodes auslesen von: PeterK
Geschrieben am: 20.07.2018 09:19:38

Hallo

Schau Dir einmal dieses Buch an (ab Seite 100 gehts los mit XML). Da es sich nur um eine Vorschau handelt sind einzelne Seiten nicht verfügbar :-(

P.S. Author ist ein Namenskollege von Dir :-)


https://books.google.at/books?id=hNqhCwAAQBAJ&pg=PA127&lpg=PA127&dq=msxml2&source=bl&ots= _
gbPIFksNQq&sig=mTLSGpg1gfOj4de6Adb_A5tgmKA&hl=de&sa=X&ved=0ahUKEwiP1u_Qi63cAhXH2CwKHTgDClYQ6AEIUTAH#v=onepage&q&f=false




Beiträge aus dem Excel-Forum zum Thema "xml: alle child nodes eines parent nodes auslesen"