xml auslesen (Linq)

  • VB.NET
  • .NET (FX) 4.0

Es gibt 42 Antworten in diesem Thema. Der letzte Beitrag () ist von toto.

    lässt sich damit nix anfangen?


    Schon:

    VB.NET-Quellcode

    1. Dim file As String = Path_B & ListView1.FocusedItem.Text & ".xml"
    2. 'Dim doc As New XDocument
    3. Dim x As XElement = XElement.Load(file)
    4. Dim getAll = x.Descendants("harmony")
    5. For Each getValue In getAll
    6. ListView2.Items.Add("|" & getValue.Element("root").Descendants("root-step").Value & _
    7. getValue.Element("kind").Attribute("text").Value)
    8. Next


    das wäre erledigt. siehe Bild
    Weiter lesen.
    Bilder
    • 1.jpg

      25,17 kB, 645×464, 35 mal angesehen
    lg toto
    @toto Das sieht ja richtig gut aus.
    Kannst Du mit den Akkorden was anfangen?
    Hast Du ein Programm, das das abspielen kann?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @ Rod bin mit der Darstellung noch nicht fertig (das Abspielen kommt noch, habe schon ein Paar Ideen)

    Im Moment bin beschäftigt mit folgendem:

    XML-Quellcode

    1. <!--=========================================================-->
    2. <measure number="16">
    3. <print/>
    4. <attributes/>
    5. <barline location="right">
    6. <bar-style>light-heavy</bar-style>
    7. </barline>
    8. <harmony print-frame="no" default-y="25" relative-x="10">
    9. [b][u]<root>
    10. <root-step>D</root-step>
    11. <root-alter>0</root-alter>
    12. </root>[/u][/b]
    13. <kind text="m7" parentheses-degrees="yes">minor-seventh</kind>
    14. <degree>
    15. <degree-value>5</degree-value>
    16. <degree-alter>-1</degree-alter>
    17. <degree-type>alter</degree-type>
    18. </degree>
    19. </harmony>
    20. <note>
    21. <pitch>
    22. <step>B</step>
    23. <alter>-1</alter>
    24. <octave>4</octave>
    25. </pitch>
    26. <duration>1536</duration>
    27. <type>half</type>
    28. <notehead>diamond</notehead>
    29. </note>
    30. <harmony print-frame="no" default-y="25" relative-x="10">
    31. [b][u]<root>
    32. <root-step>G</root-step>
    33. <root-alter>0</root-alter>
    34. </root>
    35. <kind text="7" parentheses-degrees="yes">dominant</kind>[/u][/b]
    36. <degree>
    37. <degree-value>9</degree-value>
    38. <degree-alter>-1</degree-alter>
    39. <degree-type>add</degree-type>
    40. </degree>
    41. </harmony>
    42. <note>
    43. <pitch>
    44. <step>B</step>
    45. <alter>-1</alter>
    46. <octave>4</octave>
    47. </pitch>
    48. <duration>1536</duration>
    49. <type>half</type>
    50. <notehead>diamond</notehead>
    51. </note>
    52. </measure>
    53. <!--=========================================================-->


    In einer "measure" können 2x "root" vorkommen,
    werden beide angezeigt aber falsch, siehe Bilder, Original und Meins
    Bsp.: im letzten Abschnitt sollen die Akkorden in einem Takt zusammen und nicht in zwei Takte

    PS.: wie du sehen kannst fehlt Einiges.
    Bilder
    • 1.jpg

      33,72 kB, 734×553, 32 mal angesehen
    • 2.jpg

      14,34 kB, 515×325, 32 mal angesehen
    lg toto

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „toto“ ()

    toto schrieb:

    In einer "measure" können 2x "root" vorkommen,
    Das musst Du dann halt testen mit Siblings oder so.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    frage den Knoten <root> ab

    sollte so gehen habe es aber nicht getestet

    VB.NET-Quellcode

    1. Dim x As XElement = XElement.Load("D:\XMLToto.xml")
    2. Dim getAll = x.Descendants("root")
    3. For Each getValue In getAll
    4. Debug.WriteLine(getValue.Element("root-step").Value & "-" & getValue.Element("root-alter").Value)
    5. Next getValue


    EDIT:
    könnte auch so gehen, ändere mal die Zeile zu

    VB.NET-Quellcode

    1. Dim getAll = x.Descendants("harmony").Descendants("root")

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kasi“ ()

    @ Rod bedeutet das wenn in einen Abschnitt Bsp.: "measure" 2x root:

    XML-Quellcode

    1. <root>
    2. <root-step>D</root-step>
    3. <root-alter>0</root-alter>
    4. </root>
    5. <kind text="m7" parentheses-degrees="yes">minor-seventh</kind>

    und

    XML-Quellcode

    1. <root>
    2. <root-step>G</root-step>
    3. <root-alter>0</root-alter>
    4. </root>
    5. <kind text="7" parentheses-degrees="yes">dominant</kind>


    das sie dann zusammen geschrieben werden?

    @ Kasi bekomme sie wie aus dem Bild nacheinander geschrieben

    PS.: achtet bitte nur auf die groß Buchstaben

    @ Kasi
    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    lg toto

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „toto“ ()

    @toto Nö, ein Knoten heißt root-step, der andere root-alter, hat ja @Kasi schon geschrieben.
    Du solltest etwas mehr experimentieren mit dem Beispiel in meinem Link.
    Such Dir raus, was da auf Deine Struktur passt und sieh nach, wie das dort gelöst wurde.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @ das meine ich nicht, schau dir Post#23 du wirdst sehen das alle "measure" ein "root" und ein "root-step" haben "root-alter" ist unwichtig. Und manchmal kommen in eine "measure" 2 "root" mit "root-step. Wie in den Bilder, im Original werden zusammen geschrieben bei mir getrennt.

    eine Frage hätte ich, die mich seit Heutemorgen beschäftigt:

    XML-Quellcode

    1. <identification>
    2. <creator type="composer">Kenny Dorham</creator>
    3. <creator type="lyricist">Bossa Nova</creator>


    Descendant = "identification"
    Element "creator"
    Attribut = "type"

    womit kann ich den "composer" Kenny Dohram
    und den "lyricist" Bossa Nova auslesen, habe wirklich einiges versucht.
    Danke im Voraus
    lg toto
    geschaft

    VB.NET-Quellcode

    1. Dim lyricist = From style In x.Elements("identification") _
    2. Where CStr(style.Element("creator").Attribute("type")) = "lyricist" _
    3. Select style
    4. For Each xEle As XElement In lyricist
    5. Label2.Text = (xEle.Element("creator").Value)
    6. Next
    7. Dim composer = From autor In x.Elements("identification") _
    8. Where CStr(autor.Element("creator").Attribute("type")) = "composer" _
    9. Select autor
    10. For Each xEle As XElement In composer
    11. Label3.Text = (xEle.Element("creator").Value)
    12. Next


    aber warum bleibt Labe2 leer? Sie Bild
    Bitte ein Tipp.
    Bilder
    • 3.jpg

      22,59 kB, 622×361, 31 mal angesehen
    lg toto
    @toto Du hast Deine Hausaufgaben nicht gemacht, alles Notwendige war bereits gepostet:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim file = "C:\Temp\Musik.xml"
    3. Dim doc = XDocument.Load(file)
    4. Dim elem = doc.Element("score-partwise").Element("identification")
    5. Dim xx As IEnumerable(Of XElement) = elem.Elements
    6. For Each element As XElement In xx 'element2.Element("measure").Element("harmony").Element("root").Elements()
    7. Dim ChordName As String = element.Value
    8. ListBox1.Items.Add(ChordName)
    9. Next
    10. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Rod in ListBox wird mir alles aus "identification" aufgelistet Siehe Bild

    Ich hatte eigentlich dein Link abgearbeitet

    und mit dem Code wird mir der Autor angezeigt,
    und mit dem Selben Code versuche ich dfn Style auzuzeigen
    aber Label2 bleibt leer
    Bilder
    • 4.jpg

      4,65 kB, 218×126, 191 mal angesehen
    lg toto
    Hi Toto,

    will ja nicht mekern aber dein Code in Post#29 mag ja funktionieren
    aber du fängst an dir einen schlechten Programmierstil anzueignen, und den Code in Post#30 ignoriert.

    du musst wirklich Zeit investieren und Lesen oder die Link's ansehen die du bereits
    hast

    VB.NET-Quellcode

    1. Dim x As XElement = XElement.Load("D:\XMLToto.xml")
    2. Dim getAll = x.Descendants("identification")
    3. For Each getLast In getAll
    4. Debug.WriteLine(getLast.Elements("creator").ElementAt(0).Value)
    5. Debug.WriteLine(getLast.Elements("creator").Attributes("type").ElementAt(0).Value)
    6. Debug.WriteLine(getLast.Elements("creator").ElementAt(1).Value)
    7. Debug.WriteLine(getLast.Elements("creator").Attributes("type").ElementAt(1).Value)
    8. Next getLast


    debug Output ist

    VB.NET-Quellcode

    1. Antonio-Carlos Jobim
    2. composer
    3. Bossa Nova
    4. lyricist



    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Kasi“ ()

    hallo Kasi, deine Kritik ist sehr Konstruktiv und nehme sie gern an.
    Ich lerne xml noch.

    In Post#29 habe ich den code bearbeitet was @Rod mir gepostet hat, und niergens im Link habe was gefunden wie:
    ElementAt(0).Value)

    aber wieder was gelernt.

    Post#30 Habe nicht ignoriert ( auch weil vom @Rod, der seit jahre mich begleitet).
    Sein
    Code gab mir genau was er beschreibt, Ich konnt aber es nicht umsetzen
    weil der composer und lyricist in zwei getrennte Labels erscheinen
    sollten. Evtll hätte ich erwähnen sollen.

    Wie bereit in Post#28 erwähnt:
    Descendant = "identification"
    Element "creator"
    Attribut = "type"

    womit kann ich den "composer" Kenny Dohram
    und den "lyricist" Bossa Nova auslesen, habe wirklich einiges versucht.

    habe "ElementAt" nicht gefunden und nicht gekannt, und jetzt weis ich. Weil in der XML werden viele "ElementAt" vorkommen.

    Dein Code habe natürlich weiter verwendet, weil auch verstanden, hier mein Versuch:

    VB.NET-Quellcode

    1. Dim getAll = x.Descendants("identification")
    2. For Each getValue In getAll
    3. ConsoleWriteLine(getvalue.Element("creator"=.Attribute("type")...................Value

    Wie oben erwähnt hat mir "ElementAt" gefehlt.
    Hätte ich evtll auch posten sollen, damit hätte ich vielleicht früher Hilfe bekommen.

    Ich danke dir für deine Hilfestellung und Kritik.
    @Rod an dir anch ein Dank
    Danke auch an EDR und Dksksm
    PS1.: ich verwende VB2010 und finde niergens das Debug.WriteLine Fenster
    PS2.: ich kann kaum eine Nachricht posten das beim Absenden die Meldung kommt " Ihr Sitzung ist abgelaufen, bitte melden sich erneut an"
    Kamm mir evtll jemand was dazu sagen?
    lg toto

    toto schrieb:

    niergens im Link habe was gefunden wie ...
    Das ergibt sich einfach aus der Zuweisung als IEnumerable:

    VB.NET-Quellcode

    1. Dim xx As IEnumerable(Of XElement) = elem.Elements
    Setz nen Haltepunkt drauf und sieh Dir an, was in xx steht.
    Fang doch mal an und arbeite mit dem Debugger, das ist elementar wichtig:
    Debuggen, Fehler finden und beseitigen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo an Alle,
    gibt es eine Möglichkeit folgende If Abfrage zu vereinfechen:

    VB.NET-Quellcode

    1. Dim getAllx = x.Descendants("harmony")
    2. For Each getValue In getAllx
    3. If getValue.Descendants("root-alter").Value = "0" Then
    4. getValue.Descendants("root-alter").Value = ""
    5. End If
    6. If getValue.Descendants("root-alter").Value = "1" Then
    7. getValue.Descendants("root-alter").Value = "#"
    8. End If
    9. If getValue.Descendants("root-alter").Value = "-1" Then
    10. getValue.Descendants("root-alter").Value = "b"
    11. End If
    12. If getValue.Descendants("degree-alter").Value = "0" Then
    13. getValue.Descendants("degree-alter").Value = ""
    14. End If
    15. If getValue.Descendants("degree-alter").Value = "1" Then
    16. getValue.Descendants("degree-alter").Value = "#"
    17. End If
    18. If getValue.Descendants("degree-alter").Value = "-1" Then
    19. getValue.Descendants("degree-alter").Value = "b"
    20. End If
    21. ListView2.Items.Add(getValue.Descendants("root-step").Value & _
    22. getValue.Descendants("root-alter").Value & _
    23. getValue.Element("kind").Attribute("text").Value & _
    24. getValue.Descendants("degree-alter").Value & _
    25. getValue.Descendants("degree-value").Value)

    Vielen Dank im Voraus
    lg toto
    Aus dem Kopf:

    VB.NET-Quellcode

    1. 'Anfang Deiner Sub
    2. Dim getAllx = x.Descendants("harmony")
    3. For Each getValue In getAllx
    4. getValue.Descendants("root-alter").Value = GetChangedValueOf(getValue.Descendants("root-alter").Value)
    5. getValue.Descendants("degree-alter").Value = GetChangedValueOf(getValue.Descendants("degree-alter").Value)
    6. ListView2.Items.Add(getValue.Descendants("root-step").Value & _
    7. getValue.Descendants("root-alter").Value & _
    8. getValue.Element("kind").Attribute("text").Value & _
    9. getValue.Descendants("degree-alter").Value & _
    10. getValue.Descendants("degree-value").Value)
    11. Next
    12. End Sub
    13. Private Function GetChangedValueOf(Value As String) As String
    14. Select Case Value
    15. Case "0": Return ""
    16. Case "1": Return "#"
    17. Case "-1" Return "b"
    18. Case Else: Return String.Empty
    19. End Select
    20. End Function
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo VaporiZed
    das war#s
    Vielen Dank

    @ Ich nochmal
    das ganz passiert in ein Listview, Ansicht Tile, gibt es eine möglichkeit die grid line sichtbar zu machen?

    lg toto

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „toto“ ()

    hallo,
    wie verwendet man Unicode in VB.Net?
    angenommen ich will in einer TextBox diese Code schreiben:&#8420

    Habe so probiert:

    VB.NET-Quellcode

    1. TextBox1.Text = Char.ConvertFromUtf32(&#8420)


    Dann wird mir das "&" blau unterschrieben, Intellisense sagt "Ausdruck erwartet".
    Kann mir jemand ein Tipp geben?
    Vielen Dank

    Erledigt, kann geschlosse werden
    lg toto

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „toto“ ()

    toto schrieb:

    Erledigt, kann geschlosse werden
    Und wie ist die korrekte Lösung?
    Möglicherweise hat jemand anders dasselbe Problem.
    Schließen kannst Du den Thread selber, doppelklicke auf das rote Quadrat oben neben dem Titel.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!