C++/CLI und LINQ (XML) - Schreiben klappt, aber wie wieder auslesen??



  • Hallo zusammen!

    Ich möchte gerne eine Konfigurationdatei für mein Programm nutzen, und habe mich für XML entschieden.
    Im Internet gibt es ja viele Beispiele für C# und Linq, also habe ich mich daran gemacht und eins davon verwendet.

    XML Schreiben:

    XDocument konfig =	gcnew XDocument(
    						gcnew XDeclaration("1.0", "ISO-8859-1", "yes"),
    						gcnew XComment("Konfigurations-Datei"),
    						gcnew XElement("Konfiguration",
    							gcnew XElement("Login","Benutzername",
    								gcnew XAttribute("typ","Nutzer")
    							)
    						)
    					);
    konfig.Save("C:\\test.xml);
    

    XML-Datei:

    <?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
    <!--Konfigurations-Datei-->
    <Konfiguration>
      <Login typ="Nutzer">Benutzername</Login>
    </Konfiguration>
    

    Zumindest schreibend klappt es, aber für das Auslesen mit nem Query fehlt mir Beispielcode...
    Hat das jemand von euch schonmal gemacht, und kann mir hier weiterhelfen??
    Wäre klasse.

    Gruß



  • Fehlt bei XDocument konfig nicht noch ein ^?

    Außerdem ist das nicht ansatzweise Linq.

    Man braucht dafür Closures bzw. sonst kann man es nur sehr eingeschängt benutzen.

    Du kannst ja einfach ein Programm aus den C# Code im .Net Reflector in C++/CLI übersetzen lassen (klappt vielleicht), dann siehst du was Linq so alles macht.

    ~EDIT: Mogels Hinweis~



  • Rhombicosidodecahedron schrieb:

    Du kannst ja einfach ein Programm aus den C# Code im .Net Reflector in C++/CLI übersetzen lassen (klappt vielleicht),

    mit passendem Plugin ja ... ich mache es im Moment gerade anders herum



  • mogel schrieb:

    mit passendem Plugin ja

    stimmt, hab' angemerkt

    mogel schrieb:

    ich mache es im Moment gerade anders herum

    Von C++/CLI nach C#? 😮
    Oder meinst du nibbler?



  • Das stimmt wohl, der gepostete Code hat noch nichts mit Linq zu tun.
    Aber die query-Abfrage um oben gezeigten Eintrag wieder zu bekommen gelingt mir nicht....
    Direkt dazu passende C#-Beispiele habe ich auch nicht.

    Wie bekomme ich obigen Eintrag ausgelesen?



  • nibbler schrieb:

    Wie bekomme ich obigen Eintrag ausgelesen?

    Als was? keyValuePair oder nur Benutzernamen?

    Grobe vorhensweise

    // aus dem Gedächnis
    String ^typ, ^name;
    
    // Ich bin mir nicht sicher kann mit ^ sein.
    XElement firstNode =  System::Linq::Enumerable::First( // gibt XElement zurück
    
      // musst vielleciht noch den generischen Typ mit angeben
      System::Xml::Linq::Extensions( // gibt IEnumerable<XElement> zurück
        konfig.Descendants( // gibt IEnumerable<XElement> zurück
          gcnew System::Xml::Linq::XName("Konfiguration")),
        gcnew System::Xml::Linq::XName("Login")));
    typ = firstNode.Attribute(gcnew System::Xml::Linq::XName("typ")).Value; // vielleicht -> und noch Trimmen
    name = firstNode.Value;// vielleicht -> und noch Trimmen
    


  • Rhombicosidodecahedron schrieb:

    Von C++/CLI nach C#? 😮

    ja ... ich stelle meine DLLs nun auf C# um ... ging mit den letzten beiden DLLs relativ zugüg ... C# kann irgendwie einige Dinge nicht so wie C++/CLI - aber es funktioniert ... da fehlen nur leider die Kommentare 😉

    Grund: vgl. entsprechenden Thread "32 Bit vs. 64 Bit"



  • Hallo, und danke für die bisherigen Antworten.

    Leider komme ich aber nicht weiter, da ich weder System::Linq habe.

    error C3083: "Linq": Das Symbol links neben "::" muss ein Typ sein.
    

    Außerdem kommt bei "gcnew System::Xml::Linq::XName("Konfiguration")" der Fehler, dass es keinen Kopierkonstruktor gibt.

    error C3673: "System::Xml::Linq::XName": Die Klasse hat keinen Kopierkonstruktor.
    

    Wo ist jetzt genau das Problem?



  • nibbler schrieb:

    Hallo, und danke für die bisherigen Antworten.

    Leider komme ich aber nicht weiter, da ich weder System::Linq habe.

    error C3083: "Linq": Das Symbol links neben "::" muss ein Typ sein.
    

    Du musst glaube ich "System::" rausnehmen

    nibbler schrieb:

    Außerdem kommt bei "gcnew System::Xml::Linq::XName("Konfiguration")" der Fehler, dass es keinen Kopierkonstruktor gibt.

    error C3673: "System::Xml::Linq::XName": Die Klasse hat keinen Kopierkonstruktor.
    

    Wo ist jetzt genau das Problem?

    Sry, hatte MSDN nicht so genau gelesen

    MSDN schrieb:

    Erstellen eines XName-Objekts

    XName enthält keine öffentlichen Konstruktoren. Stattdessen stellt diese Klasse eine implizite Konvertierung von String bereit, die es Ihnen ermöglicht, einen XName zu erstellen.

    Hoffendlich klappt das auch in C++/CLI

    Außerdem: http://weblogs.asp.net/kennykerr/archive/2006/05/11/The-Linq-between-C_2300_-and-C_2B002B00_.aspx


Anmelden zum Antworten