XML Daten auslesen hilfe benötigt

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Scarala.

    XML Daten auslesen hilfe benötigt

    Hallo ihr lieben,

    ich muss für ein kleines tool, das ich grad schreibe, Daten aus einer XML-Datei auslesen.
    Habe schon viel im Internet und hier rumgesucht, aber nichts gefunden, das mir bei meinem Problem helfen kann.

    in der XML steht mehrfach folgender Datensatz:

    XML-Quellcode

    1. <Consumption id="xxx" good="xxx" amount="xxx" intermediateLevel="xxx">
    2. <Tax minInhabitants="x" maxInhabitants="xx" gold="xxx"/>
    3. </Consumption>


    Aus diesen Datensätzen muss ich good, amount und gold auslesen und jeweils auf einzelnen labels ausgeben. (Die werte aus den einzelnen Labels werden später für berechnungen benötigt)

    Also im Prinzip die drei Daten aus dem ersten Datensatz auslesen und in Label1, Label2 und Label3 schreiben
    Dann die drei Daten aus dem zweiten Datensatz auslesen und in Label4, Label5 und Label6 schreiben und so weiter...

    Vielleicht hat jemand ne idee?!

    MFG

    Scarala
    Hallo

    Ich würde das in etwa folgendermassen versuchen:

    VB.NET-Quellcode

    1. Imports system.xml 'Import um die Befehle verwenden zu können
    2. Dim xDoc As New XmlDocument
    3. xdoc.Load(pfad_zur_xml_datei) 'oder xdoc.loadxml(string_mit_xml)
    4. Dim rootNode As XmlNode = xdoc.DocumentElement
    5. For Each child As XmlNode In rootNode.ChildNodes
    6. Dim label As String = child.Attributes("id").Value
    7. 'das gleiche mit good und amount
    8. Dim gold As String = child.SelectSingleNode("Tax").Attributes("gold").Value
    9. 'gespeicherte Werte dann in die Labels schreiben
    10. Next


    Das XML sollte so ausgelesen werden können (evt. musst du noch Tippfehler korrigieren)
    Natürlich vorausgesetzt, wie ErfinderDesRades schon angemekrt hat, dass das XML nicht mehr als

    XML-Quellcode

    1. <config>
    2. <Consumption id="xxx" good="xxx" amount="xxx" intermediateLevel="xxx">
    3. <Tax minInhabitants="x" maxInhabitants="xx" gold="xxx"/>
    4. </Consumption>
    5. </config>
    enthält. Ansonsten musst du dir rootNode über einen XPath-Ausdruck zuweisen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „michivandersar“ () aus folgendem Grund: Ergänzt, Code verschönert (Gross-/Kleinschreibung)

    Dem ist leider nicht so @michivandersar

    Die XML ist recht umfangreich.

    Hier mal ein Link: game-cdn.anno-online.com/de/796/data/game_settings.xml

    Später kommt in der selben XML auch noch irgendwo:

    XML-Quellcode

    1. <ProductionDefinition id="xx" name="xx" inputTyp="xx" outputGood="xx" inputField="xx" outputStorage="xx" productionTime="xx"/>


    Da muss ich dann auch noch outputGood und productionTime auslesen...
    Falls dich die XPath's nicht ansprechen, kannst du auch via .selectNodes() auf entsprechende Subnodes zugreifen.

    Theoretisch musst du dir ein weiteres xmlNode-Objekt machen und das auf rootNode.selectSingleNode("PopulationDefinitions") verweisen.

    danach kannst du eine Schlaufe machen, die dann obiges abarbeitet.

    Also in etwa so:

    VB.NET-Quellcode

    1. Sub Main()
    2. Try
    3. Dim xDoc As New XmlDocument
    4. xDoc.Load("C:\game_settings.xml") 'oder xdoc.loadxml(string_mit_xml)
    5. Dim root As XmlNode = xDoc.DocumentElement
    6. Dim popDef As XmlNode = root.SelectSingleNode("PopulationDefinitions").SelectSingleNode("Population")
    7. For Each relativeNeed As XmlNode In popDef.SelectNodes("RelativeNeed")
    8. Dim cons As XmlNode = relativeNeed.SelectSingleNode("Consumption")
    9. Dim id As String = cons.Attributes("id").Value 'dasselbe für good und amount
    10. Dim gold As String = cons.SelectSingleNode("Tax").Attributes("gold").Value
    11. Next
    12. Catch ex As Exception
    13. Console.Write(ex.ToString)
    14. End Try
    15. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „michivandersar“ () aus folgendem Grund: Habe ein Node übersehen ;)

    Werds Montag mal ausprobieren, hab meinen Stick mit dem VB-Projekt auf Arbeit liegen lassen.
    Also, ich habe den code mal getest.

    Funktioniert soweit.

    Nun kommen zwei weitere probleme dazu:

    1. hört er nach den ersten 3 "Consumption" auf auszulesen. Danach kommt im code auch erstmal "AbsoluteNeed",die ich nicht brauche.

    gibt es da eine möglichkeit, das er erst bei folgendem Punkt anfängt auszulesen?

    XML-Quellcode

    1. <Population civLevel="Nobleman"


    also das er in folgender Zeile aus deinem Code

    VB.NET-Quellcode

    1. Dim popDef As XmlNode = root.SelectSingleNode("PopulationDefinitions").SelectSingleNode("Population")

    überprüft, das in civLevel "Noblem" steht, und nur dann anfängt auszulesen? Da drunter wären nämlich direkt untereinander alle werte zu finden, die ich brauche.

    Edit 2. ist gestrichen


    Edit by Manschula: Es gibt eine Bearbeiten-Funktion - diese bitte auch verwenden! --> Beiträge zusammengeführt

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

    Wie sortierst du denn deine Label?
    Du wirst ja irgendwann nicht drum rumkommen sie irgendwie in einem Container scrollbar zu machen,
    also kannst du eigentlich auch gleich auf ein Datagridview oder Kollegen umsteigen.

    Einzelne Labels verballern ist eher suboptimal, aber ich weiß ja nicht wie dein GUI aussieht...
    und du endest dann mit einem Form, wo 500 Labels drauf sind?

    IMO hast du eine verfehlte Architektur, und solltest deine Daten besser im DatagridView anzeigen. Dazu müssteste dich aber erstmal mit typisiertem Dataset auseinandersetzen, also das Framework sieht schon ein Super-Instrumentarium zur Daten-Präsentation vor, aber man muß leider erstmal lernen, es einzusetzen:
    Daten laden, speichern, verarbeiten

    Geht aber eiglich nix drumrum, denn ein Form mit 100 Labels ist FacePalm
    Werde ich mich mit beschäftigen, danke :)
    Okay, habe jetzt mal ein DataSet erstellt.

    Aber bekomme Die Variablen ID, Good, Amount und Gold nicht in eine Zeile geschrieben und dann soll er ja bei der nächsten schleife eine neue zeile machen.

    Hab jetz schon viel gegoogelt, aber finde nix...


    Edit by Manschula: Es gibt eine Bearbeiten-Funktion - diese bitte auch verwenden! --> Beiträge zusammengeführt

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

    Edit

    Habs alles hinbekommen. Mein Code ist jetzt folgender:

    VB.NET-Quellcode

    1. Imports System.Xml
    2. Public Class Form1
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Dim xDoc As New XmlDocument
    5. xDoc.Load("D:\Desktop\game_settings.xml")
    6. Dim root As XmlNode = xDoc.DocumentElement
    7. Try
    8. Dim popDef As XmlNode = root.SelectSingleNode("PopulationDefinitions")
    9. For Each Population As XmlNode In popDef.SelectNodes("Population")
    10. For Each RelNeed As XmlNode In Population.SelectNodes("RelativeNeed")
    11. For Each Consumption As XmlNode In RelNeed.SelectNodes("Consumption")
    12. Dim id As String = Consumption.Attributes("id").Value
    13. Dim good As String = Consumption.Attributes("good").Value
    14. Dim amount As String = Consumption.Attributes("amount").Value
    15. Dim gold As String = Consumption.SelectSingleNode("Tax").Attributes("gold").Value
    16. Dim newRow As DataSet1.WerteWarenRow
    17. newRow = DataSet1.WerteWaren.NewWerteWarenRow()
    18. newRow.ID = id
    19. newRow.Good = good
    20. newRow.Amount = amount
    21. newRow.Gold = gold
    22. DataSet1.WerteWaren.Rows.Add(newRow)
    23. Next
    24. Next
    25. Next
    26. Catch ex As Exception
    27. Console.Write(ex.ToString)
    28. End Try
    29. Try
    30. Dim ProdDef As XmlNode = root.SelectSingleNode("Productions")
    31. For Each Productions As XmlNode In ProdDef.SelectNodes("ProductionDefinition")
    32. Dim id2 As String = Productions.Attributes("id").Value
    33. Dim good2 As String = Productions.Attributes("outputGood").Value
    34. Dim prod As String = Math.Abs(1 / Productions.Attributes("productionTime").Value * 30)
    35. Dim newRow2 As DataSet2.ProduktionRow
    36. newRow2 = DataSet2.Produktion.NewProduktionRow()
    37. newRow2.ID = id2
    38. newRow2.Ware = good2
    39. newRow2.Produktionszeit = prod
    40. DataSet2.Produktion.Rows.Add(newRow2)
    41. Next
    42. Catch ex As Exception
    43. Console.Write(ex.ToString)
    44. End Try
    45. End Sub
    46. End Class


    Auslesen werde ich das ganze dann für meine Berechnungsformeln mit

    VB.NET-Quellcode

    1. DataSet1.WerteWaren([Zeile]).[Spalte]
    bzw

    VB.NET-Quellcode

    1. DataSet2.Produktion([Zeile]).[Spalte]


    Danke für die Hilfe und schönes Wochenende euch allen :)

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Scarala“ ()

    bisserl vereinfacht

    VB.NET-Quellcode

    1. For Each Population As XmlNode In xDoc.DocumentElement.SelectSingleNode("PopulationDefinitions/Population")
    2. For Each RelNeed As XmlNode In Population.SelectNodes("RelativeNeed")
    3. For Each Consumption As XmlNode In RelNeed.SelectNodes("Consumption")
    4. Dim id As String = Consumption.Attributes("id").Value
    5. Dim good As String = Consumption.Attributes("good").Value
    6. Dim amount As String = Consumption.Attributes("amount").Value
    7. Dim gold As String = Consumption.SelectSingleNode("Tax").Attributes("gold").Value
    8. DataSet1.WerteWarenRow.AddWerteWarenRow( id,good, amount, gold)
    9. Next
    10. Next
    11. Next
    TryCatch ist ein heißes Eisen
    Dann sagt er mir "AddWerteWarenRow" ist kein Member von "WindowsApplication1.DataSet1.WerteWarenRow"

    Edit

    Es musste heißen

    VB.NET-Quellcode

    1. DataSet1.WerteWaren.AddWerteWarenRow(id, good, amount, gold)


    Da war ein Row zu viel drin.

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