XML Daten im Programm speichern



  • Moin,

    mal ne kurze Frage von mir an euch:

    Welche Methoden verwendet ihr, um die User-Daten, die in einem XML File gespeichert sind, im Programm selbst zwischen zu speichern, so dass ich auf diese Daten ohne XML File einen schnellen Zugriff habe?

    Ich würde gern eine std::map für dies verwenden - mit <nodenname><value>.

    Allerdings müsste ich das ja dann für jeden Node (mynode, mynode2) machen? Macht das Sinn?

    <name:mynode attr1="value1" attr2="value2" />
    <name:mynode2 attr1="value1" attr2="value2" />
    

    Gruß
    Patrick



  • Ich benutze std::vectorstd::string damit speichere ich daten.
    Natürlich kann man map oder sonst was benutzten jeder container hat seine eigenen stärken.



  • vielleicht noch kurz als Nachtrag: was bedeutet es eigentlich ein XML File als Property Liste abzuspeichern? Beziehungsweise pro XML Node einen Property Liste zu installieren?



  • Das macht nur dann Sinn, wenn jedes Blatt eindeutig gekennzeichnet werden kann. Und es kommt auf die XML Daten an, wenn die XML Daten Objekteigenschaften enthalten macht es mMn mehr Sinn, diese Objektstruktur abzubilden statt key/value Paare zu speichern.
    Hast du vielleicht eine XML Datei, die du hier posten kannst (evtl. nur einen Ausschnitt, falls sie zu groß ist)?



  • DocShoe schrieb:

    Das macht nur dann Sinn, wenn jedes Blatt eindeutig gekennzeichnet werden kann.)

    Wie meinst du das genau? Normalerweise sollte in einem xml file alles eindeutig gekennzeichnet sein, oder?

    DocShoe schrieb:

    Und es kommt auf die XML Daten an, wenn die XML Daten Objekteigenschaften enthalten macht es mMn mehr Sinn, diese Objektstruktur abzubilden statt key/value Paare zu speichern.
    Hast du vielleicht eine XML Datei, die du hier posten kannst (evtl. nur einen Ausschnitt, falls sie zu groß ist)?

    Hier ist ein kleiner Auszug aus der XML Datei, die die Struktur so wie ich es bis jetzt gemacht habe, widerspiegelt.

    <?xml version="1.0" encoding="UTF-8"?>
    <xmldata>
    <!-- name of the xml file configuration --> 
    <Name>configuration: default</Name>
    
    <ethernet:Config xmlns:ethernet="#">
            <ethernet:Sel groupName="ipcfg" checked="true" id="dhcp" level="DHCP"/>
            <ethernet:Sel groupName="ipcfg" checked="false" id="statip" level="IP"/>
            <ethernet:Ip disable="false" level="192.168.23.1" /> 
            <ethernet:Subnet disable="false" level="255.255.255.0" /> 
    </ethernet:Config> 
    
    <display:Config xmlns:display="#">
            <display:Brightness disabled="false" level="100" />
            <display:Contrast disabled="false" level="60" />
            <display:State disabled="false" checked="true" /> 
    </display:Config>
    
    </xmldata>
    


  • Patrick P. schrieb:

    Wie meinst du das genau? Normalerweise sollte in einem xml file alles eindeutig gekennzeichnet sein, oder?

    Du kannst jeden Knoten benennen wie du willst, die Knoten müssen keinen eindeutigen Namen haben. Für Sachen wie XPath macht das aber schon Sinn, eindeutige Namen zu vergeben. Liegt halt am Erzeuger der XML Datei.

    Patrick P. schrieb:

    Hier ist ein kleiner Auszug aus der XML Datei, die die Struktur so wie ich es bis jetzt gemacht habe, widerspiegelt.

    Das heißt, du hast schon eine Struktur/Klasse mit den entsprechenden Attributen?



  • DocShoe schrieb:

    Patrick P. schrieb:

    Hier ist ein kleiner Auszug aus der XML Datei, die die Struktur so wie ich es bis jetzt gemacht habe, widerspiegelt.

    Das heißt, du hast schon eine Struktur/Klasse mit den entsprechenden Attributen?

    Nein bis jetzt existiert nur mal dieses XML File sowie eine Klasse XML.class in der ich das Xml File einlese und anschhließend irgendwie sinnvoll abspeichern möchte (z.B. std::map).

    Ich werde auch eine Klasse Display und eine Klasse Netzwerk erstellen, die dann auf die XML Klasse zugreifen sollen und die für sie relevanten Daten abholen.

    Gruß
    Patrick



  • Patrick P. schrieb:

    Ich werde auch eine Klasse Display und eine Klasse Netzwerk erstellen, die dann auf die XML Klasse zugreifen sollen und die für sie relevanten Daten abholen.

    Genau das meinte ich. Statt die Werte einzelner Knoten in einer std::map abzulegen könntest du ein Objekt (abhängig vom Knotentyp) mit den Werten der Knoten/Blätter füllen (class Ethernet/Display in deinem Beispiel). Das macht mMn mehr Sinn, da es Einstellungen logisch gruppiert und die programminterne Handhabung oder das Laden/Speichern in anderen Formaten vereinfacht.



  • DocShoe schrieb:

    Patrick P. schrieb:

    Ich werde auch eine Klasse Display und eine Klasse Netzwerk erstellen, die dann auf die XML Klasse zugreifen sollen und die für sie relevanten Daten abholen.

    Genau das meinte ich. Statt die Werte einzelner Knoten in einer std::map abzulegen könntest du ein Objekt (abhängig vom Knotentyp) mit den Werten der Knoten/Blätter füllen (class Ethernet/Display in deinem Beispiel). Das macht mMn mehr Sinn, da es Einstellungen logisch gruppiert und die programminterne Handhabung oder das Laden/Speichern in anderen Formaten vereinfacht.

    Ich hatte jetzt eigentlich nicht vor, dass diese Klassen (Netzwerk, Display) die Informationen aus der XML Liste speichern, sondern lediglich abholen, falls sie benötigt werden. Das Problem ist nämlich u.a. folgendes: über den integrierten Webserver als auch über das Display können all diese Werte (aus dem XML File) geändert werden. Wenn ich jetzt mehrere Klassen habe die alle einen Part dieses XML Files verwenden, wäre der Updatevorgang um einiges umständlicher.



  • Denke um: Nicht das XML-File ist das Zentrum deines Programms, sondern die Klassen. Das XML-File dient nur dazu, die aktuelle Konstellation auf Festplatte zu sichern, um diesen Zustand später wieder herstellen zu können.
    Es macht außerdem keinen (großen) Unterschied, ob du jetzt die Datenhaltung in eine map packst, oder Klassen dafür erstellst. Du brauchst für beides eine zentrale Stelle, an der die Map/Klassen gespeichert sind, eine Methode, um die map/Klassen zu füllen (aus dem XML), sowie eine Methode, um den Zustand zurück in das XML-File zu schreiben.


Anmelden zum Antworten