XML auslesen

  • VB.NET

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

    XML auslesen

    Hallo Leute,

    ich versuche derzeit verzweifelt eine XML auszulesen :/

    XML-Quellcode

    1. <?xml version="1.0"?>
    2. -<item>
    3. <objid>10376</objid>
    4. <device>s1</device>
    5. <coverage/>
    6. <downtime>0,1184%</downtime>
    7. <downtime_raw>000000000001184</downtime_raw>
    8. <uptime>99,8816%</uptime>
    9. <uptime_raw>000000000998816</uptime_raw>
    10. <uptimetime>669 Tg.</uptimetime>
    11. <uptimetime_raw>000000057805704</uptimetime_raw>
    12. <sensor>HTTP</sensor>
    13. <dateonly>26.07.2017</dateonly>
    14. <dateonly_raw>42942.0000000000</dateonly_raw>
    15. <lastvalue>71 ms</lastvalue>
    16. <lastvalue_raw>71.0000</lastvalue_raw>
    17. </item>


    Von dieser XML, möchte ich den sensor und die downtime auslesen und in eine Variable speichern.

    Aktueller Code:

    VB.NET-Quellcode

    1. Dim wc As New System.Net.WebClient()
    2. wc.Credentials = New System.Net.NetworkCredential(txt_Name.Text, txt_PW.Text)
    3. wc.Encoding = System.Text.UTF8Encoding.UTF8
    4. Dim allSensors = wc.DownloadString(url)
    5. Dim allSensorsParsed = XDocument.Parse(allSensors)
    6. Dim certificate As XElement
    7. Dim domain As String
    8. 'SSL-ZERTIFIKATE ERKENNEN
    9. For Each certificate In allSensorsParsed.<sensors>.<item>
    10. For Each domain In allSensorsParsed.<sensors>.<item>.<sensor>
    11. If domain.Contains("SSL-Zertifikatssensor") Then
    12. Dim DomainName = certificate.<item>.@sensor
    13. Dim downtime = certificate.<item>.@downtime
    14. End If
    15. Next
    16. Next


    Irgendwelche Verbesserungsvorschläge bzw. Ideen wie ich es realisieren könnte?
    @darKo Ich hab mal ein wenig rumgespielt.
    Wenn Du die XML-Datei leicht erweiterst (Element <item2>) passiert dies (ansonsten wird objid nicht gelesen):
    XML

    XML-Quellcode

    1. <?xml version="1.0"?>
    2. <item>
    3. <item2>
    4. <objid>10376</objid>
    5. <device>s1</device>
    6. <coverage/>
    7. <downtime>0,1184%</downtime>
    8. <downtime_raw>000000000001184</downtime_raw>
    9. <uptime>99,8816%</uptime>
    10. <uptime_raw>000000000998816</uptime_raw>
    11. <uptimetime>669 Tg.</uptimetime>
    12. <uptimetime_raw>000000057805704</uptimetime_raw>
    13. <sensor>HTTP</sensor>
    14. <dateonly>26.07.2017</dateonly>
    15. <dateonly_raw>42942.0000000000</dateonly_raw>
    16. <lastvalue>71 ms</lastvalue>
    17. <lastvalue_raw>71.0000</lastvalue_raw>
    18. </item2>
    19. </item>
    VB.NET

    VB.NET-Quellcode

    1. Imports System.Xml
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim path = "C:\Temp\Test.xml"
    5. Dim reader = XmlReader.Create(path)
    6. While reader.Read()
    7. If (reader.NodeType = XmlNodeType.Element) Then
    8. Me.ListBox1.Items.Add(reader.Name & " " & reader.ReadString())
    9. End If
    10. End While
    11. End Sub
    12. End Class

    Bilder
    • XML.jpg

      18,68 kB, 286×293, 255 mal angesehen
    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!

    darKo schrieb:

    Von dieser XML, möchte ich den sensor und die downtime auslesen und in eine Variable speichern.
    Das xml ist unvollständig - von sowas kann man garnix auslesen.

    und "den sensor" - gibts auch nicht. Weil wie mir das aussieht, gibts da mehrere sensor-Einträge.

    Auch "auslesen" als Problembeschreibung ist unumsetzbar ungenau.
    Was soll denn bei rauskommen, beim "Auslesen", und wo soll das ausgelesene hin?

    Die beste Problembeschreibung ist immer eine leere Methode.
    Sowas zB:

    VB.NET-Quellcode

    1. private function ReadSensorDownTimes(xDoc as XDocument) as Dictionary(Of String, Timespan)
    2. End Function
    Da weiss man genau, was die Methode machen soll: Ein XDocument geht hinein, und ein Dictionary bekommt man dafür zurück.
    Und dann kann man überlegen, wie die Methode das schafft.

    Aber du musst den Methoden-Vorschlag machen, nicht ich. Weil Ich hab dein Problem ja noch garnet verstehen können - deine Methoden-Vorgabe wird mir evtl. dabei helfen.
    @RodFromGermany Hey, danke schon mal, bis jetzt klappt alles supi. Die XML lässt sich nun auch auslesen, ohne dass ich <item2> hinzufüge :D , allerdings stehe ich nun vor einer weiteren Herausforderung.

    Habe nun neine neue XML

    XML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. - <sensors
    3. totalcount="80" listend="1">
    4. <version>17.3.32.2339</version>
    5. - <item>
    6. <sensor>SSL-Zertifikatssensor</sensor>
    7. <lastvalue>82 #</lastvalue>
    8. <lastvalue_raw>82.0000</lastvalue_raw>
    9. <objid>13140</objid>
    10. </item>
    11. - <item>
    12. <sensor>HTTP</sensor>
    13. <lastvalue>333 ms</lastvalue>
    14. <lastvalue_raw>333.0000</lastvalue_raw>
    15. <objid>5693</objid>
    16. </item>


    Ich will hier unterscheiden zwischen SSL-Zertifikatssensor & HTTP und brauche anschließend deren objid, um eine neue XML zu downloaden welche mehr Informationen enthält.

    Mein Code sieht bisher wie folgt aus:

    VB.NET-Quellcode

    1. While reader.Read()
    2. If cBox_Content.SelectedItem = "Ausfallzeiten" Then
    3. If reader.Value.Contains("HTTP") Then
    4. Dim hittpreader = XmlReader.Create(baseLink + "id=" + Hier muss die objid hin)
    5. End If
    6. ElseIf cBox_Content.SelectedItem = "Zertifikate" Then
    7. If reader.Value.Contains("SSL-Zertifikatssensor") Then
    8. ...
    9. End If
    10. End If

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

    darKo schrieb:

    und brauche anschließend deren objid
    Wo ist das Problem?
    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!
    Mit meinem Code hast Du die Lista aller Objekte (Name, Inhalt).
    Die musst Du einzeln durchklingeln oder Du packst das ganze in ein Dictionary(Of String, String), da kannst Du Deinen Wert einfach abrufen.
    Die Frage ist, wieviel Aufwand Du reinstecken willst oder wie oft das ganze aufgerufen wird => siehe Post #7 vom @ErfinderDesRades.
    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!