Windows Leistungsindex-XML auslesen

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Schalterschorsch.

    Windows Leistungsindex-XML auslesen

    Hallo,

    ich habe mir XML etwas näher angesehen und erste "Leseversuche" in der XML vom Windows-Leistungsindex gemacht.
    Als Beispiel habe ich mir den microsoft-Artikel hier angeschaut: msdn.microsoft.com/de-de/library/bb979298.aspx
    Den Leistungsindex habe ich auslesen können.
    Nun wollte ich auch den "Random read " Wert auslesen.
    Der steht in einem Array und meine Suchroutine läuft leider nach ien paar Ergebnissen in eine Exception.
    Da die Feldlänge nicht von mir begenzt ist, verstehe ich nicht, warum das passiert.
    Eine gute Seite, die auch solche Dinge gut erklärt, würde mir auch gut helfen.

    Damit
    man es leichter nachstellen kann, poste ich den ganzen code - der obere
    teil sucht einfach nach dem aktuellsten xml vom disk-test.

    VB.NET-Quellcode

    1. Dim SsdDetectedFlagG As Boolean = False
    2. Dim DiskScorenodeFound As Boolean = False
    3. Dim DiskScoreString As String = "0.0"
    4. Dim LastAccessPath As String = ""
    5. ' - element diskscore und dann text
    6. If System.IO.Directory.Exists("C:\Windows\Performance\WinSAT\DataStore") Then
    7. ' Our method to get the most recently updated score.
    8. ' Because the program makes a new XML file on every update of the score,
    9. ' we need to calculate the most recent, just incase the owner has upgraded.
    10. Dim Dir As New IO.DirectoryInfo("C:\Windows\Performance\WinSAT\DataStore")
    11. Dim fileDir() As IO.FileInfo
    12. Dim fileMostRecent As IO.FileInfo
    13. Dim LastAccessTime As Date
    14. fileDir = Dir.GetFiles
    15. ' Loop through the files in the \WinSAT dir to find the newest one.
    16. For Each fileMostRecent In fileDir
    17. If fileMostRecent.LastAccessTime >= LastAccessTime Then
    18. If fileMostRecent.FullName.ToLower Like "*disk*" Then
    19. ' MsgBox("recent diskfile" & fileMostRecent.FullName, MsgBoxStyle.SystemModal)
    20. LastAccessTime = fileMostRecent.LastAccessTime
    21. LastAccessPath = fileMostRecent.FullName
    22. End If
    23. End If
    24. Next
    25. ' MsgBox("no match bliart" & LastAccessTime, MsgBoxStyle.SystemModal)
    26. Else
    27. SsdDetectedFlagG = False
    28. Exit Sub
    29. End If
    30. ' Wir benötigen einen XmlReader für das Auslesen der XML-Datei
    31. Dim XMLReader As Xml.XmlReader _
    32. = New Xml.XmlTextReader(LastAccessPath) ' ("2013-11-15
    33. 23.07.43.454 Disk.Assessment (Recent).WinSAT.xml") '("quickie.xml")
    34. ' Es folgt das Auslesen der XML-Datei
    35. With XMLReader
    36. Do While .Read ' Es sind noch Daten vorhanden
    37. ' Welche Art von Daten liegt an?
    38. Select Case .NodeType
    39. ' Ein Element
    40. Case Xml.XmlNodeType.Element
    41. If .Name.ToString.ToLower = "diskmetrics" Then '"diskscore" Then
    42. DiskScorenodeFound = True
    43. MsgBox("found")
    44. Else
    45. ' MsgBox("no")
    46. End If
    47. ' MsgBox("Es folgt ein Element vom Typ " & .Name)
    48. ' Alle Attribute (Name-Wert-Paare) abarbeiten
    49. If .AttributeCount > 0 Then
    50. ' Es sind noch weitere Attribute vorhanden
    51. While .MoveToNextAttribute ' nächstes
    52. MsgBox("Feldname: " & .Name & _
    53. " -> " & _
    54. "Feldwert: " & .Value)
    55. End While
    56. End If
    57. ' Ein Text
    58. Case Xml.XmlNodeType.Text
    59. If DiskScorenodeFound = True Then
    60. 'MsgBox("Es folgt ein Text: " & .Value)
    61. DiskScoreString = .Value
    62. Exit Do
    63. End If
    64. ' Ein Kommentar
    65. 'Case Xml.XmlNodeType.Comment
    66. ' MsgBox("Es folgt ein Kommentar: " & .Value)
    67. End Select
    68. Loop ' Weiter nach Daten schauen
    69. .Close() ' XMLTextReader schließen
    70. End With


    So sieht die XML an dem Teil aus, den ich auslesen will:




    Gruß

    Schorsch

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

    Habe mir diverse Infos (auch deine Sammlung) schon angeschaut und habe weiterhin eine Sache, die ich hier nicht verstehe:
    - ich kann z.B. den Faktor auslesen, er ist über das Element mit Namen Factor= "..." für mich suchbar.
    - Der Wert, den ich will, ist als Text definiert und ist kein Teil vom vorhergehenden Element.
    ich frage z.B. ab nach kind im Element responsiveness-score und dann bekomme ich "average io-rate" raus - nicht aber average io rate , "512,12"

    Hatte ursprünglich gedacht, dass das als array vorliegt und ich es falsch auslese und es daher abstürzt.
    Du kannst ein Node mit bekannten Attribute-Name und Attribute-Wert anhand folgendes Musters auswählen: //NodeName[@AttributeName='AttributeValue']
    Beispiel:

    VB.NET-Quellcode

    1. Dim xmlDoc As New Xml.XmlDocument
    2. xmlDoc.Load(filename)
    3. Dim nodeName = "Responsiveness"
    4. Dim attrName = "Kind"
    5. Dim attrValue = "AverageIORate"
    6. ' Patter zur Auswahl eines Node mit bekannten NodeName,
    7. ' AttributeName und AttributeWert
    8. Dim path = String.Format("//{0}[@{1}='{2}']", nodeName, attrName, attrValue)
    9. Dim node = xmlDoc.SelectSingleNode(path)
    10. If node IsNot Nothing Then
    11. Debug.Print("NodeContent: {0}", node.InnerText)
    12. For Each attr As Xml.XmlAttribute In node.Attributes
    13. Debug.Print("AttributeName: {0}, AttributeValue: {1}", _
    14. attr.Name, attr.Value)
    15. Next
    16. Else
    17. Debug.Print("Node nicht gefungen!")
    18. End If
    ich hatte gehofft, dass ich es auf solch eine Art auslesen kann.
    Leider funktioniert das so nicht. Ich bekomme hier nur "kind" und "average io-rate" als Ergebnis. Der Zahlenwert kann so nicht ausgelesen werden.
    Der Wert ist irgendwie im node drin und gehört nicht zu dem Node von "average io-rate - ist also nicht Attributwert2 zu Attributname. Das ist, was mich so verwirrt.
    Ich habe 5 oder 6-mal gelesen, oder öfter. Ich habe trotzdem nicht verstanden, was du da geschrieben hast.
    Hast du dieses Node 'gefunden'?
    Was willst du denn auslesen? Der InnerText von dem Node oder den Wert einer der Attribute von diesem Node?
    Was funktioniert denn nicht?
    Wie hast du den Code verwendet?
    Was hast du als Ergebnis bekommen?
    Ich habe den Fehler gefunden, des hat mich bald in den Wahnsinn getrieben :/

    Danke für eure Hilfe und Geduld mit mir :)

    Ich habe nicht gesehen, dass in dem xml Kind einmal groß und bei meiner geänderten Abfrage in klein dastand. Das sieht im IE sehr gleich aus.
    Normalerweise mache ich alles .tolower und achte daher auf sowas nicht.


    *facepalm*
    Murphy's law in Aktion


    Meine funktionierende Abfrage ist jetzt:

    VB.NET-Quellcode

    1. Dim xmlDoc As New Xml.XmlDocument
    2. xmlDoc.Load("C:\Windows\Performance\Winsat\DataStore\2013-11-15 23.07.43.454 Disk.Assessment (Recent).WinSAT.xml")
    3. Dim nodeName = "AvgThroughput" '"Responsiveness" '
    4. Dim attrName = "kind"
    5. Dim attrValue = "Sequential Read" '"AverageIORate"
    6. ' Patter zur Auswahl eines Node mit bekannten NodeName,
    7. ' AttributeName und AttributeWert
    8. Dim path = String.Format("//{0}[@{1}='{2}']", nodeName, attrName, attrValue)
    9. Dim node = xmlDoc.SelectSingleNode(path)
    10. If node IsNot Nothing Then
    11. MsgBox("NodeContent: {0}" & node.InnerText)
    12. For Each attr As Xml.XmlAttribute In node.Attributes
    13. MsgBox("AttributeName: {0}, AttributeValue: {1}" & _
    14. attr.Name & " " & attr.Value)
    15. Next
    16. Else
    17. Debug.Print("Node nicht gefunden!")
    18. End If