Xml Quellcode auslesen und in eine TextBox laden mithilfe von RegEx

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von NscMike.

    Xml Quellcode auslesen und in eine TextBox laden mithilfe von RegEx

    Hi vb-paradise community,

    hab folgendes problem, wollte mit regex den titel und den artist eines radiosender auslesen, von einer xml datei

    hier ist mal mein erster versuch


    VB.NET-Quellcode

    1. Option Explicit On
    2. Option Strict On
    3. Imports System.Text.RegularExpressions
    4. Public Class Form1
    5. Const WEBADRESSE As String = "http://tray.technobase.fm/radio.xml" ' <--- ANPASSEN
    6. Dim rgx As Regex
    7. Dim HTMLQuelltext As String
    8. Dim SeiteGeladen As Boolean
    9. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    10. Dim Suchmuster As String
    11. Dim Trefferliste As MatchCollection
    12. Dim Treffer As String
    13. Dim Pos As Integer
    14. SeiteNeuLaden()
    15. ' Bestandteile des Suchmusters:
    16. ' (?<= ) Wenn Kombination gefunden, dann LookBack/Zurückschauen (?<= ), ob ...
    17. ' id=""Content_Show""> ... id="Content_Show" am Anfang steht ...
    18. ' \s* ... gefolgt von keinem oder mehreren Spaces bis was anders kommt ...
    19. ' <div style= ... gefolgt von <div style= ...
    20. ' .+> ... gefolgt von einem oder mehreren beliebigen Zeichen bis > kommt ...
    21. ' [^<]* ... gefolgt von keinem oder mehreren belibigen Zeichen (außer <) bis </div> kommt ...
    22. ' {2} ... insgesamt 2-mal muß der Suchstring in (....) passen
    23. ' Wenn alle diese Überprüfungen erfüllt sind, dann ist die Kombination ein gültiger Treffer
    24. Suchmuster = "(?<= <link>http://www.TechnoBase.FM.+>)(/*<picture>.+>\s*[^<]*</artist>){2}"
    25. ' Optionen: Groß-/Kleinschreibung ignorieren, Mehrzeiliger Text
    26. rgx = New Regex(Suchmuster, RegexOptions.IgnoreCase _
    27. Or RegexOptions.Multiline)
    28. Trefferliste = rgx.Matches(HTMLQuelltext) ' Alle Treffer ermitteln
    29. If Trefferliste.Count = 0 Then ' Trefferliste enthält keine Treffer
    30. TextBox1.Text = "Error"
    31. ElseIf Trefferliste.Count = 1 Then ' Trefferliste enthält genau 1 Treffer
    32. Treffer = Trefferliste.Item(0).ToString.Trim ' Spaces am Anfang und Ende entfernen
    33. Pos = Treffer.LastIndexOf("</div>")
    34. Treffer = Treffer.Remove(Pos) ' Letztes </div> entfernen
    35. Pos = Treffer.LastIndexOf(">") + 1
    36. Treffer = Treffer.Substring(Pos).Trim ' Alles ab dem letzten > nehmen
    37. TextBox1.Text = (Treffer)
    38. Else ' Trefferliste enthält mehr als 1 Treffer
    39. TextBox1.Text = "Mehr als 1 Tag gefunden"
    40. End If
    41. End Sub
    42. ' ********************************************************************************
    43. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    44. Handles MyBase.Load
    45. 'WebBrowser1.Visible = False
    46. SeiteNeuLaden()
    47. End Sub
    48. ' ********************************************************************************
    49. Private Sub SeiteNeuLaden()
    50. SeiteGeladen = False
    51. Try
    52. WebBrowser1.Navigate(WEBADRESSE) ' Seite aus den Internet laden
    53. Catch ex As Exception
    54. TextBox1.Text = "Fehler beim Laden"
    55. End Try
    56. Do Until SeiteGeladen = True ' Warten bis vollständig geladen
    57. System.Windows.Forms.Application.DoEvents()
    58. Loop
    59. End Sub
    60. ' ********************************************************************************
    61. Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, _
    62. ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) _
    63. Handles WebBrowser1.DocumentCompleted
    64. HTMLQuelltext = WebBrowser1.DocumentText ' Quellcode in Variable speichern
    65. SeiteGeladen = True
    66. 'MessageBox.Show(HTMLQuelltext.Length.ToString) ' Nur für Testzwecke (Länge des Quelltextes)
    67. End Sub
    68. End Class


    der link zur xml datei ist tray.technobase.fm/radio.xml


    Ausschnitt aus Quellcode der xml Datei:

    Quellcode

    1. <radio>
    2. <name>TechnoBase</name>
    3. <moderator>G4bby</moderator>
    4. <show>We aRe oNe! (G4bsTyLe Generation Cut)</show>
    5. <style>HandsUp</style>
    6. <starttime>18</starttime>
    7. <endtime>20</endtime>
    8. <link>http://www.TechnoBase.FM/member/10</link>
    9. <picture>http://profil.technobase.eu/profil_small10-5.jpg</picture>
    10. <artist>Cascada</artist>
    11. <song>Evacuate The Dancefloor</song>
    12. <release>http://www.TechnoBase.FM/release/cascada/3150/evacuate-the-dancefloor</release>


    so die Zeile <name>TechnoBase</name> kommt im ganzen dokument nur einmal vor, die anderen ändern sich teilweise
    die Zeile <link>http://www.TechnoBase.FM/member/10</link> bleibt bis technobase.fm unverändert! also folgendes <link>http://www.TechnoBase.FM

    Diese beiden Zeilen kommen auch nur einmal im gesamten xml dokument vor.


    so nun wollte ich den artist also "Cascada" und den titel des songs also "Evacuate The Dancefloor" in eine textbox laden. (Nur als Beispiel, Artist und Titel ändern sich ständig)

    wollte es so versuchen das er erstmal Cascada lädt

    Suchmuster = "(?<=<name>TechnoBase</name>)(\s* <moderator>.+>\s*[^<]*</artist>){2}"

    Ging aber nicht :(

    habs auch mal mit:

    Suchmuster = "(?<= <link>http://www.TechnoBase.FM.+>)(/*<picture>.+>\s*[^<]*</artist>){2}"

    probiert ging aber auch nicht.

    Was habe ich falsch gemacht bzw was muss ich dann noch ergänzen damit ich den Artist und den Titel in eine TextBox laden kann?

    Das ganze sollte dann in einer textbox so erscheinen "Cascada - Evacuate The Dancefloor"

    habe eigtl alles gecheckt also muss mein suchmuster falsch sein!

    könntet ihr mir beim suchmuster helfen?

    bräuchte wirklich dringend eure hilfe

    mfg Mike

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

    Hi.

    In der aktuellen c't (4/2010) steht, wie du dein Vorhaben erheblich einfacher realisieren kannst. Du solltest den Kauf dieser Ausgabe in Erwägung ziehen. Nichtsdestotrotz hier ein Ansatz: Über WebBrowser.Document.GetElementsByTagName("artist") bekommst du ganz einfach alle Künstlernamen, die im artist-Tag stehen. Genauso geht das mit den Songtiteln.
    Gruß
    hal2000
    danke für den Tipp werd mir die Ausgabe mal anschaun

    mit WebBrowser.Document.GetElementsByTagName("artist") bekomme ich alle jop richtig

    aber in der xml datei gibt es eben 5 mal den artist eintrag

    wie kann ich die der reihenfolge nach ansteuern??