Wie kann ich aus einer XML Datei bestimmte Infos auslesen?

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von MR_NMS.

    Wie kann ich aus einer XML Datei bestimmte Infos auslesen?

    Hallo,

    ​ich möchte gerne aus einer vorhanden .XML Datei nur bestimmte Werte auslesen.
    XML siehe Anhang!

    ​Ich möchte gerne, das nur der Umsatz zu einem bestimmten Datum summiert wird und in einer TextBox angezeigt wird.
    ​Die Daten sollen nur für Auswertungen verwendet werden und nicht neu geschrieben, oder eingefügt werden!

    Ist das möglich?

    Danke
    Matthias
    Bilder
    • XMLAnsicht.PNG

      33,9 kB, 1.827×312, 263 mal angesehen

    MR_NMS schrieb:

    Ist das möglich?
    Klar.
    Kannst Du dazu bitte mal eine syntaktisch vollständige XML-Datei posten?
    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!
    @MR_NMS Mal als Anhaltspunkt:

    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\UmsatzdatenCarwashtest.xml"
    5. Dim reader = XmlReader.Create(path)
    6. While reader.Read()
    7. If (reader.NodeType = XmlNodeType.Element) Then
    8. If reader.Name = "UmsatzGesamt" Then
    9. Me.ListBox1.Items.Add(reader.Name & " " & reader.ReadString())
    10. End If
    11. End If
    12. End While
    13. End Sub
    14. End Class
    Bilder
    • XML.jpg

      21,05 kB, 286×293, 245 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!
    HI!
    Habe es bis jetzt so hinbekommen, das ich zu einem bestimmten Datum den dazugehörigen Umsatz bekomme.
    Jetzt stockt es aber wieder.
    Ich habe bis jetzt noch keinen Plan, wie ich es machen soll, das ich für einen bestimmten Datumsbereich eine Summe vom Umsatz erhalte.
    Code bis jetzt:

    VB.NET-Quellcode

    1. Dim xmlFile As XmlReader
    2. xmlFile = XmlReader.Create("D:\UmsatzdatenCarwashtest.xml", New XmlReaderSettings())
    3. Dim ds As New DataSet
    4. Dim dv As DataView
    5. ds.ReadXml(xmlFile)
    6. dv = New DataView(ds.Tables(0))
    7. dv.Sort = "Datum"
    8. Dim index As Integer = dv.Find(TextBox1.Text)
    9. If index = -1 Then
    10. MsgBox("Keine Übereinstimmung")
    11. Else
    12. TextBox2.Text = dv(index)("UmsatzGesamt").ToString
    13. End If


    Ich hoffe ich bin auf dem richtigen Weg!

    Matthias

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

    Ja, sicher ist das möglich. Warum Du aber da den gezeigten Umweg über DataSet und DataView gehst, ist m.E. eine Pfeil-Brust-Auge-Konstellation. Da wäre es sinnvoller und sauberer, gleich ein typisiertes DataSet mit vorgefertigten DataTables anzulegen und da rein zu importieren. Dann kann man auch problemlos mit LINQ super filtern, sortieren und rumrechnen.
    Alternativ ziehst Du Dir aus den Rohdaten die entsprechenden Werte raus, aber führt auf Dauer nur zu Frust und unflexibler Programmierung.
    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.
    Sollte so klappen:

    VB.NET-Quellcode

    1. DataSetName.UmsatzdatenDataTable.Where(Function(x) x.Datum >= MindestDatum AndAlso x.Datum <= MaximalDatum).Sum(Function(x) x.UmsatzGesamt).ToString)

    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.
    Hi,

    LINQ ist Dein Freund:

    VB.NET-Quellcode

    1. Imports <xmlns="http://tempuri.org/UmsatzdatenDataSet.xsd">
    2. '[...]
    3. Dim ci As New System.Globalization.CultureInfo("en-US") ' Punkt statt Komma als Dezimaltrenner
    4. Dim doc As XDocument = XDocument.Load("UmsatzdatenCarwashtest.xml")
    5. Dim result = Aggregate row In doc.<UmsatzdatenDataSet>...<UmsatzdatenDataTable> Where CDate(row.<Datum>.Value()) > #11/1/2017# And CDate(row.<Datum>.Value()) < #11/3/2017# Into Sum(Double.Parse(row.<UmsatzGesamt>.Value(), ci))


    Wenn es unbedingt das DataSet sein soll, aus dem das XML offenbar stammt:

    VB.NET-Quellcode

    1. Dim ds As New System.Data.DataSet
    2. ds.ReadXml("UmsatzdatenCarwashtest.xml")
    3. Dim ci As New System.Globalization.CultureInfo("en-US") ' Punkt statt Komma als Dezimaltrenner
    4. Dim result = Aggregate row In ds.Tables(0) Where CDate(row("Datum")) > #11/1/2017# And CDate(row("Datum")) < #11/3/2017# Into Sum(Double.Parse(row("UmsatzGesamt").ToString(), ci))


    Die Typkonvertierungen sind nervig, also binde für Variante 1 das xsd-Schema ein oder generiere für Variante 2 das passende typisierte Dataset daraus (mit xsd.exe aus den VS-Tools).

    Edit: Zu spät...
    Gruß
    hal2000