XML auslesen ChildNodes

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von mjLem.

    XML auslesen ChildNodes

    :?:
    Hallo,

    ich habe folgendes Problem mit eine XML Datei mit folgendem Aufbau ( und bin Anfänger in Sachen XML):

    XML-Quellcode

    1. <Knoten1>
    2. <Knoten2>
    3. <Knoten3>
    4. <Knoten_A>"Text"</Knoten_A>"
    5. <Knoten_B>"Text"</Knoten_B>"
    6. .
    7. .
    8. <Knoten_C>
    9. <Knoten_D>"Text"</Knoten_D>"
    10. </Knoten_C>"
    11. <Knoten_C>
    12. <Knoten_D>"Text"</Knoten_D>"
    13. </Knoten_C>"
    14. <Knoten_C>
    15. <Knoten_D>"Text"</Knoten_D>"
    16. </Knoten_C>"
    17. </Knoten3>
    18. <Knoten3>
    19. <Knoten_A>"Text"</Knoten_A>"
    20. <Knoten_B>"Text"</Knoten_B>"
    21. .
    22. .
    23. <Knoten_C>
    24. <Knoten_D>"Text"</Knoten_D>"
    25. </Knoten_C>"
    26. <Knoten_C>
    27. <Knoten_D>"Text"</Knoten_D>"
    28. </Knoten_C>"
    29. <Knoten_C>
    30. <Knoten_D>"Text"</Knoten_D>"
    31. </Knoten_C>"
    32. </Knoten3>
    33. </Knoten2>
    34. </Knoten1>


    Ich habe nun versucht die Werte der "ChildNodes" von Knoten_3 auszulesen:

    VB.NET-Quellcode

    1. .
    2. Dim NodeIter As XPathNodeIterator
    3. .
    4. strExpression = "/Knoten1/Knoten2/Knoten3"
    5. NodeIter = nav.Select(strExpression)
    6. While (NodeIter.MoveNext())
    7. xmlText &= NodeIter.Current.SelectSingleNode("Knoten_A").Value & " | "
    8. xmlText &= NodeIter.Current.SelectSingleNode("Knoten_B").Value & " | "
    9. xmlText &= NodeIter.Current.SelectSingleNode("Knoten_C/Knoten_B").Value & " | "
    10. End While
    (vb.net express 2010)

    Das funktioniert auch soweit. Leider finde ich keinen Weg vom mehrfach vorkommenden "Knoten_C/Knoten_D" (ChildNode von Knoten_3) die Werte auszulesen.
    Ich erhalte mit dieser Methode immer nur den ersten Wert dieses Knotens bevor das Programm zum nächtsen Knoten_3 springt.

    xmlText sieht dann ungefähr so aus:
    Knoten_A.value | Knoten_B.value |(Knoten_C/Knoten_D(1.WERT).value > 1.Knoten3 wird gelesen
    Knoten_A.value | Knoten_B.value |(Knoten_C/Knoten_D(2.WERT).value > 1.Knoten3 wird nicht mehr gelesen
    Knoten_A.value | Knoten_B.value |(Knoten_C/Knoten_D(1.WERT).value > 2.Knoten3wird gelesen
    Knoten_A.value | Knoten_B.value |(Knoten_C/Knoten_D(2.WERT).value > 2.Knoten3wird nicht gelesen

    Kann ich mit XPathNodeIterator ab einer bestimmten Position alle ChilNodes auslesen, bevor ich mit While(.movenext) weiterspringe (weitere Schleife für ChildNodes)?

    Ich hoffe ich habe mich ( trotz mangelnder Terminologie in XML) halbwegs verständlich ausgedrückt.

    Im Vorraus schon mal herzlicheb Dank für reinschauen.
    Sollte ich icm falschen Forum sein, wäre ich für eine Info dankbar.

    mjLem
    Hi,
    zuerstmal Danke für's Antworten.
    Bei dieser Methode habe ich das Problem eine "Datensatzstruktur" zu bekommen
    1.Datensatz = 1.Knoten3 = 1.Zeile
    2.Datenstaz = 2.Knoten3 = 2.Zeile
    etc.
    Zeilenweiser Aufbau zum Export der Daten nach Excel/Access. 1 Zeile pro Knoten3

    Hast Du schon eine Lösung?

    Hi,

    nein. Habe gestern mal im Galileo-Buch "Einstieg in XML" geblättert, bin dort aber auf noch keine Lösung gestoßen. Suche immer noch nach einer Möglichkeit um in der aktuellen Position des XPathNodeIteradors eine weitere Schleife zu generieren die alle "Knoten_C/Knoten_D" durchläuft. Also nicht .SelectSingleNode.

    Da ich das ganze während der Arbeitszeit betreibe und manchmal andere Dinge anfallen, komme ich nicht immer schnell voran.

    Danke für die Nachfrage.

    Sobald ich eine Lösung habe stelle ich Sie zur Verfügung.

    Lösung, wenn auch nicht schön

    :D

    Hi,

    mangels neuer Ideen und Zeit hab ich mir eine - wenn auch Quick-and-Dirty-Lösung - zusammen gestrickt. Nicht schön, aber funktionert.

    Vorab: Im VB-Code oben habe ich fälschlicherweise folgendendes angegeben:

    xmlText &= NodeIter.Current.SelectSingleNode("Knoten_C/Knoten_B").Value & " | "

    richtig:

    xmlText &= NodeIter.Current.SelectSingleNode("Knoten_C/Knoten_D").Value & " | "



    Hier meine Schnelllösung:

    VB.NET-Quellcode

    1. Private Sub mnu_xml_read_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnu_xml_read.Click
    2. 'Nicht schön, aber funktioniert soweit.
    3. Dim nxDatensatz As Boolean = False ' FALSE Text wird nicht übergeben, TRUE Text wird übergeben
    4. Dim xmltext As String = ""
    5. 'XMLReader zum lesen der Datei
    6. Dim XMLReader As Xml.XmlReader _
    7. = New Xml.XmlTextReader("c:\clist.xml") '("test.xml")
    8. 'Datei auslesen
    9. With XMLReader
    10. Do While .Read 'Solange Daten vorhanden sind
    11. 'Welche Art von Daten liegt an?
    12. If .NodeType = XmlNodeType.Element Then
    13. If .Name = "Knoten_A" Then
    14. xmltext &= vbCrLf
    15. nxDatensatz = True
    16. ElseIf .Name = "Knoten_B" Then
    17. nxDatensatz = True
    18. ElseIf .Name = "Knoten_D" Then ' Der mehrfachvorkommende Knoten
    19. nxDatensatz = True
    20. End If
    21. End If
    22. Select Case .NodeType
    23. Case Xml.XmlNodeType.Text
    24. If nxDatensatz = True Then
    25. xmltext &= .Value & "|"
    26. nxDatensatz = False
    27. End If
    28. End Select
    29. Loop
    30. .Close()
    31. End With
    32. rtf_info.Text = xmltext
    33. End Sub




    Viel Spass beim Verbessern und nochmals Danke für Eure Info's

    mjLem