Unterzweig einer XML über LINQ Auslesen

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Unterzweig einer XML über LINQ Auslesen

    Hallo,

    ich habe folgendes Problem: Ich muss aus einer XML-Date werte auslesen und dann in ein Datatable schreiben.
    Ich habe mich dazu für LINQ entschieden. Meine XML Datei sieht so aus:

    Spoiler anzeigen

    XML-Quellcode

    1. <?xml version="1.0" encoding="iso8859-1" ?>
    2. <PosData>
    3. <Tables>
    4. <Table>
    5. <Statist>2011-02-28</Statist>
    6. <Table>20</Table>
    7. <Party>1</Party>
    8. <Archive>88</Archive>
    9. <VatOh>0</VatOh>
    10. <InSummary>1</InSummary>
    11. <BillNum>189577</BillNum>
    12. <Amount>875</Amount>
    13. <Ordered>
    14. <date>28.02.2011</date>
    15. <time>15:56:07</time>
    16. <terminal>2</terminal>
    17. <termname>Kasse2</termname>
    18. <waiter>2</waiter>
    19. <waitername>Bea Busse</waitername>
    20. <costcenter>0</costcenter>
    21. <centername></centername>
    22. <Round>1</Round>
    23. <Count>1</Count>
    24. <DCount>1.000</DCount>
    25. <Plu>1114</Plu>
    26. <Article>Aperol Sekt 0,1l</Article>
    27. <Price>430</Price>
    28. <RateIH>1900</RateIH>
    29. <RateOH>1900</RateOH>
    30. <Family>90905</Family>
    31. <FamGroup>1</FamGroup>
    32. <Discount>0</Discount>
    33. <FamilyName>Aperitif - Sekt</FamilyName>
    34. <Amount>430</Amount>
    35. <Voided>0</Voided>
    36. <Moved>0</Moved>
    37. <Credit>0</Credit>
    38. <Rate>1900</Rate>
    39. <Net>361</Net>
    40. <Vat>69</Vat>
    41. <VatName>19,00 % MwSt</VatName>
    42. </Ordered>
    43. <Ordered>
    44. <date>28.02.2011</date>
    45. <time>15:56:09</time>
    46. <terminal>2</terminal>
    47. <termname>Kasse2</termname>
    48. <waiter>2</waiter>
    49. <waitername>Bea Busse</waitername>
    50. <costcenter>0</costcenter>
    51. <centername></centername>
    52. <Round>1</Round>
    53. <Count>1</Count>
    54. <DCount>1.000</DCount>
    55. <Plu>1201</Plu>
    56. <Article>Grauer Burgunder 0,2</Article>
    57. <Price>445</Price>
    58. <RateIH>1900</RateIH>
    59. <RateOH>1900</RateOH>
    60. <Family>90902</Family>
    61. <FamGroup>1</FamGroup>
    62. <Discount>0</Discount>
    63. <FamilyName>Wein</FamilyName>
    64. <Amount>445</Amount>
    65. <Voided>0</Voided>
    66. <Moved>0</Moved>
    67. <Credit>0</Credit>
    68. <Rate>1900</Rate>
    69. <Net>374</Net>
    70. <Vat>71</Vat>
    71. <VatName>19,00 % MwSt</VatName>
    72. </Ordered>
    73. <Paid>
    74. <date>28.02.2011</date>
    75. <time>16:22:33</time>
    76. <terminal>2</terminal>
    77. <termname>Kasse2</termname>
    78. <waiter>2</waiter>
    79. <waitername>Bea Busse</waitername>
    80. <costcenter>0</costcenter>
    81. <centername></centername>
    82. <Return>0</Return>
    83. <Amount>875</Amount>
    84. <Given>875</Given>
    85. <Tip>0</Tip>
    86. <Payform>1</Payform>
    87. <Discount>0</Discount>
    88. <PayformName>BAR</PayformName>
    89. <GuestCount>1</GuestCount>
    90. <PayNum>198144</PayNum>
    91. <Voided>0</Voided>
    92. <InCashSummary>1</InCashSummary>
    93. <Currency>1</Currency>
    94. <CurrencyName>Euro</CurrencyName>
    95. <CurrencyShort>EUR</CurrencyShort>
    96. <CurrencyRate>1</CurrencyRate>
    97. <HotelRoom></HotelRoom>
    98. <HotelGuest></HotelGuest>
    99. <Client>0</Client>
    100. <ClientName></ClientName>
    101. <KostSummary>V</KostSummary>
    102. <HotelAmount></HotelAmount>
    103. <HotelNewam></HotelNewam>
    104. </Paid>
    105. <Archived>
    106. <date>28.02.2011</date>
    107. <time>16:22:33</time>
    108. <terminal>0</terminal>
    109. <termname></termname>
    110. <waiter>2</waiter>
    111. <waitername>Bea Busse</waitername>
    112. <costcenter>0</costcenter>
    113. <centername></centername>
    114. <Payform>1</Payform>
    115. <Voided>0</Voided>
    116. <Pays>1</Pays>
    117. </Archived>
    118. </Table>
    119. </Tables>
    120. </PosData>



    Wobei die Die Anzahl an Ordered, Paid und Archieved unterschiedlich sein kann.
    In meinem folgenden Code will ich die Werte aus beiden Ordered laden, bekomme jedoch als resultat
    pro Tisch immer nur ein Ergebnis.

    VB.NET-Quellcode

    1. Dim xmlDoc = XDocument.Load(Filename)
    2. Dim TableItems = From TableItem In xmlDoc.Descendants("Table") _
    3. Select TableItem
    4. Dim Werte = From Table In TableItems _
    5. Select New With {.Datum = Table.<Ordered>.<date>.Value, _
    6. .Zeit = Table.<Ordered>.<time>.Value, _
    7. .Dauer = 1, _
    8. .PersID = Table.<Ordered>.<waiter>.Value, _
    9. .KstID = 0, _
    10. .Brutto_ges = 0, _
    11. .Netto_ges = 0, _
    12. .MwSt_ges = 0, _
    13. .Brutto = Table.<Ordered>.<Amount>.Value, _
    14. .Netto = Table.<Ordered>.<Net>.Value, _
    15. .MwSt = Table.<Ordered>.<Vat>.Value, _
    16. .AnzOrder = Table.<Ordered>.<Count>.Value, _
    17. .AnzKD = 0, _
    18. .Closed = 1, _
    19. .Trainee = 1, _
    20. .CenterID = Table.<Ordered>.<costcenter>.Value, _
    21. .CenterName = Table.<Ordered>.<centername>.Value, _
    22. .HauptgruppenID = Table.<Ordered>.<FamGroup>.Value, _
    23. .Hauptgruppe = "", _
    24. .UntergruppenID = Table.<Ordered>.<Family>.Value, _
    25. .Untergruppe = Table.<Ordered>.<FamilyName>.Value}


    Das Ergebnis.

    Mein Ziel ist es, dass ich den Amount-, Net-, und Vat-Wert aus beiden Orderd zusammen rechnen kann (wenn sie in der selben Stunde liegen).
    Hat jemand vielleicht eine Idee wie ich auch in die anderen Ordered bereiche (wie in diesem Beispiel den 2. Baum). ?(

    Vielen Dank schon mal im vorraus
    Joel

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

    Du kannst doch die DataTable direkt befüllen:

    VB.NET-Quellcode

    1. Dim dt As New DataTable
    2. dt.ReadXml(Filename)
    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!

    RodFromGermany schrieb:

    Du kannst doch die DataTable direkt befüllen:

    VB.NET-Quellcode

    1. Dim dt As New DataTable
    2. dt.ReadXml(Filename)


    Hei Rod,

    dann habe ich das Problem das ich nicht mehr beachten kann ob die Bestellungen, zum Umsatz gehören oder nicht das zwischen der Tabele 'Table' und der Tabele 'Ordered' keine Verbindung mehr besteht.
    und ich brauche aus der Tabele 'Table' den Eintrag <InSummary>.

    Hier ist nochmal ein Link zur XML-Datei:
    XML

    Joel schrieb:

    und dann in ein Datatable schreiben.

    Die Frage ist: Wie sieht deine DataTable aus?

    Also ich sehe in dem Xml 4 DataTables:
    Table, Ordered, Paid, Archieved

    Das kann man schon iwie in ein Dataset einlesen.

    Natürlich nur ein typisiertes Dataset nehmen, und da auch die Beziehungen zwischen diesen Tabellen modellieren.

    Aber dazu müsste man genau wissen, wie diese Dinge zusammenhängen.

    Berechnungen aus den Daten eines typisierten Datasets anstellen, ist dann supereinfach.