XML Datei einlesen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    XML Datei einlesen

    Hallo zusammen,

    ich habe eine XML Datei, die ich einlesen möchte.
    Ich bekomme das hin das sich alle werte von "<SalesGroupStatement>" einlese.
    Ich benötige aber dazu auch die Information "<DailyStatement Number="XXXX">"
    und die "Station No" zu jeder "<SalesGroupStatement>" Datensatz.

    So wie ich es mache, liest er nur den ersten Datensatz aus.
    Hat jemand ein Tipp für mich?




    XML-Quellcode

    1. <?xml version="1.0" encoding="ISO-8859-1"?>
    2. <Root>
    3. <Received>
    4. <StationNo>102</StationNo>
    5. <ReceivedTimestamp>2021-08-16T08:40:08+02:00</ReceivedTimestamp>
    6. </Received>
    7. <DailyStatement Number="3559">
    8. <Timestamp>2021-08-15T23:55:00+02:00</Timestamp>
    9. <SalesGroupStatement CommodityGroupNumber="69" ServiceType="1">
    10. <Timestamp>2021-08-15T05:00:00+02:00</Timestamp>
    11. <UnitPrice>0,749</UnitPrice>
    12. <UnitPriceNew>0,749</UnitPriceNew>
    13. <FinalAmount>0,00</FinalAmount>
    14. <FinalQuantity>0,00</FinalQuantity>
    15. <ForecourtType>H</ForecourtType>
    16. </SalesGroupStatement>
    17. <SalesGroupStatement CommodityGroupNumber="96" ServiceType="8">
    18. <Timestamp>2021-08-15T05:00:00+02:00</Timestamp>
    19. <UnitPrice>1,800</UnitPrice>
    20. <UnitPriceNew>1,800</UnitPriceNew>
    21. <FinalAmount>0,00</FinalAmount>
    22. <FinalQuantity>0,00</FinalQuantity>
    23. <ForecourtType>H</ForecourtType>
    24. </SalesGroupStatement>
    25. </DailyStatement>
    26. <DailyStatement Number="3560">
    27. <Timestamp>2021-08-15T23:55:00+02:00</Timestamp>
    28. <SalesGroupStatement CommodityGroupNumber="69" ServiceType="1">
    29. <Timestamp>2021-08-15T05:00:00+02:00</Timestamp>
    30. <UnitPrice>0,749</UnitPrice>
    31. <UnitPriceNew>0,749</UnitPriceNew>
    32. <FinalAmount>0,00</FinalAmount>
    33. <FinalQuantity>0,00</FinalQuantity>
    34. <ForecourtType>H</ForecourtType>
    35. </SalesGroupStatement>
    36. <SalesGroupStatement CommodityGroupNumber="97" ServiceType="1">
    37. <Timestamp>2021-08-15T05:00:00+02:00</Timestamp>
    38. <UnitPrice>0,499</UnitPrice>
    39. <UnitPriceNew>0,499</UnitPriceNew>
    40. <FinalAmount>0,00</FinalAmount>
    41. <FinalQuantity>0,00</FinalQuantity>
    42. <ForecourtType>H</ForecourtType>
    43. </SalesGroupStatement>
    44. <SalesGroupStatement CommodityGroupNumber="69" ServiceType="8">
    45. <Timestamp>2021-08-15T05:00:00+02:00</Timestamp>
    46. <UnitPrice>0,749</UnitPrice>
    47. <UnitPriceNew>0,749</UnitPriceNew>
    48. <FinalAmount>0,00</FinalAmount>
    49. <FinalQuantity>0,00</FinalQuantity>
    50. <ForecourtType>H</ForecourtType>
    51. </SalesGroupStatement>
    52. </DailyStatement>
    53. </Root>


    VB.NET-Quellcode

    1. Dim doc As New XmlDocument()
    2. doc.Load(XMLDATEI)
    3. Dim nodes As XmlNodeList = doc.DocumentElement.SelectNodes("/Root")
    4. For Each node As XmlNode In nodes
    5. STATIONNO = node.SelectSingleNode("Received/StationNo").InnerText
    6. RECEIVED_TIMESTAMP = node.SelectSingleNode("Received/ReceivedTimestamp").InnerText
    7. NUMBER_ABR = node.SelectSingleNode("DailyStatement/@Number").InnerText
    8. TIMESTAMP_ABR = node.SelectSingleNode("DailyStatement/Timestamp").InnerText
    9. SERVICETYPE = node.SelectSingleNode("DailyStatement/SalesGroupStatemen/@ServiceType").InnerText
    10. COMMODITYGROUPNUMBER = node.SelectSingleNode("DailyStatement/SalesGroupStatemen/@CommodityGroupNumber").InnerText
    11. TIMESTAMP_PRICE = node.SelectSingleNode("DailyStatement/SalesGroupStatemen/Timestamp").InnerText
    12. UNITPRICE = node.SelectSingleNode("DailyStatement/SalesGroupStatemen/UnitPrice").InnerText
    13. UNITPRICENEW = node.SelectSingleNode("DailyStatement/SalesGroupStatemen/UnitPriceNew").InnerText
    14. FINALAMOUNT = node.SelectSingleNode("DailyStatement/SalesGroupStatemen/FinalAmount").InnerText
    15. FINALQUNATITY = node.SelectSingleNode("DailyStatement/SalesGroupStatemen/FinalQuantity").InnerText
    16. FORECOURTTYPE = node.SelectSingleNode("DailyStatement/SalesGroupStatemen/ForecourtType").InnerText
    17. Console.WriteLine("COMMODITYGROUPNUMBER: " + node.SelectSingleNode("DailyStatement/SalesGroupStatemen/@CommodityGroupNumber").InnerText + "ServiceType: " + node.SelectSingleNode("DailyStatement/SalesGroupStatemen/@ServiceType").InnerText)
    18. Next

    Da wirst du wohl man im Debug Modus durchsteppen müssen und dir den Inhalt der Variablen anschauen.
    Als erstes wird dir auffallen, dass es nur ein Element Root gibt, du hast also nur diesen einen node. Wenn du Root als node behandelst, dann schau nach ob es childnodes gibt (ja, gibt es).
    Also kommt als nächstes eine For Each Schleife für jede childnode, die du wiederrum seperat abfragst. So in einem Rutsch geht es mit dieser Herangehensweise nicht.

    Ob es einen besseren Weg gibt weiß ich nicht, schätze aber schon, siehe die Diskussion LinqToXML hier im forum.
    Hallo,
    Serialisierung ist eigentlich immer ein sehr eleganter Weg. Der Vorteil ist, dass du dich um das Einlesen so gut wie nicht kümmern musst. Du musst nur Klassen zur Verfügung stellen, die die Struktur deines Xml widerspiegeln. Ich habe das Beispielhaft für dein Xml mal gemacht (Ist ein C#-Projekt - bitte ggf. selbst nach VB.NET konvertieren) - aber Achtung: Alle Eigenschaften in den Klassen sind im Moment Strings. Das sollte angepasst werden, da z.B. das Element "Unit Price" eigentlich eine Fließkommazahl ist.
    Dateien
    • XmlDemoProject.zip

      (17,51 kB, 173 mal heruntergeladen, zuletzt: )
    Das ist dann aber schon die Profilösung :)

    Zugabe

    C#-Quellcode

    1. foreach (var dailyStatement in statement.DailyStatement)
    2. {
    3. Console.WriteLine(dailyStatement.Number);
    4. foreach (var salesGroupStatement in dailyStatement.SalesGroupStatement)
    5. {
    6. Console.WriteLine($"COMMODITYGROUPNUMBER: {salesGroupStatement.CommodityGroupNumber} ServiceType: {salesGroupStatement.ServiceType}");
    7. }
    8. Console.ReadKey();
    9. }


    Nachtrag: mightykudu hat da eine interessante Hilfe bereitgestellt. Schöne und hilfreiche Zeitersparnis

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

    Danke für die Informationen langsam verstehe ich das und kämpfe mich da durch.
    Mein Problem ist noch mit dem Zugriff. Für mich ist das komplett neu.
    Ich mach da noch was verkehrt.

    Könnte mir jemand ein Beispiel geben.

    VB.NET-Quellcode

    1. Dim reader As New System.Xml.Serialization.XmlSerializer(GetType(Received))
    2. Dim file As New System.IO.StreamReader(
    3. "c:\temp\abr.xml")
    4. Dim overview As Received
    5. overview = CType(reader.Deserialize(file), Received)
    6. Console.WriteLine(overview.StationNo)

    Web: XML Class Generator

    Klasse:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. // using System.Xml.Serialization;
    2. // XmlSerializer serializer = new XmlSerializer(typeof(Root));
    3. // using (StringReader reader = new StringReader(xml))
    4. // {
    5. // var test = (Root)serializer.Deserialize(reader);
    6. // }
    7. [XmlRoot(ElementName="Received")]
    8. public class Received {
    9. [XmlElement(ElementName="StationNo")]
    10. public int StationNo { get; set; }
    11. [XmlElement(ElementName="ReceivedTimestamp")]
    12. public DateTime ReceivedTimestamp { get; set; }
    13. }
    14. [XmlRoot(ElementName="SalesGroupStatement")]
    15. public class SalesGroupStatement {
    16. [XmlElement(ElementName="Timestamp")]
    17. public DateTime Timestamp { get; set; }
    18. [XmlElement(ElementName="UnitPrice")]
    19. public double UnitPrice { get; set; }
    20. [XmlElement(ElementName="UnitPriceNew")]
    21. public double UnitPriceNew { get; set; }
    22. [XmlElement(ElementName="FinalAmount")]
    23. public double FinalAmount { get; set; }
    24. [XmlElement(ElementName="FinalQuantity")]
    25. public double FinalQuantity { get; set; }
    26. [XmlElement(ElementName="ForecourtType")]
    27. public string ForecourtType { get; set; }
    28. [XmlAttribute(AttributeName="CommodityGroupNumber")]
    29. public int CommodityGroupNumber { get; set; }
    30. [XmlAttribute(AttributeName="ServiceType")]
    31. public int ServiceType { get; set; }
    32. [XmlText]
    33. public string Text { get; set; }
    34. }
    35. [XmlRoot(ElementName="DailyStatement")]
    36. public class DailyStatement {
    37. [XmlElement(ElementName="Timestamp")]
    38. public DateTime Timestamp { get; set; }
    39. [XmlElement(ElementName="SalesGroupStatement")]
    40. public List SalesGroupStatement { get; set; }
    41. [XmlAttribute(AttributeName="Number")]
    42. public int Number { get; set; }
    43. [XmlText]
    44. public string Text { get; set; }
    45. }
    46. [XmlRoot(ElementName="Root")]
    47. public class Root {
    48. [XmlElement(ElementName="Received")]
    49. public Received Received { get; set; }
    50. [XmlElement(ElementName="DailyStatement")]
    51. public List DailyStatement { get; set; }
    52. }