XML - SelectSingleNode - Ausgabe



  • Hallo,

    ich befinde mich bei meinen ersten Schritten was XML angeht und will nun einen einzelnen Knoten bzw. den Text des Knoten auslesen.
    Mein Dokument sieht ungefähr so aus, wobei es sehr viele Stationen gibt und ich diese rausgenommen habe:

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <Abenteuer>
      <Stationen nummer="0" Text="Der  erste Test.">
        <Station nummer="1">nur ein test<Auswahl1 next="2" /><Auswahl2 next="3">eintreten</Auswahl2><Auswahl3 next="10">wieder gehen</Auswahl3></Station>
    </Abenteuer>
    

    Ich möchte mir nun den Text von Station ausgeben lassen.
    Dabei habe ich schon alle möglichen Sachen versucht und habe aber immer das Problem, dass ich den gesamten Text von der Station bekomme.

    Hier ein Bsp:

    String ^inhalt;
       XmlDocument^ doc = gcnew XmlDocument();
       doc -> Load(dateiname);
       XmlNamespaceManager^ nsmgr = gcnew XmlNamespaceManager(doc -> NameTable);
       nsmgr -> AddNamespace("dsa", "http://www.marco.de");
       XmlNode^ station;
       XmlElement^ root = doc -> DocumentElement;
      station = root -> SelectSingleNode("/Abenteuer/Stationen/Station");
      inhalt = station ->InnerText;
       return inhalt;
    

    Ich habe natürlich auch schon andere Sachen versucht BSP

    inhalt = station ->Value
    

    oder mit einer genaueren Abfrage und Namensraum.

    station = root -> SelectSingleNode("/Abenteuer/Stationen/Station[@nummer='1']", nsmgr);
    

    Ich bekomme aber immer als Ergebnis den kompletten Inhalt also:

    *************************************
    **nur ein testeintretenwieder gehen**
    *************************************

    Frage ich aber mit der selben "XPath-Abfrage" in XMLspy die Datei ab.
    So gibt XMLspy mir nur den Text den ich haben will. Auch das Beispiel in der MSDN gibt immer den gesamten Inhalt des Textes an obwohl es dort anders steht.....
    [url]
    http://msdn.microsoft.com/en-us/library/h0hw012b.aspx
    [/url]

    Jemand ne Idee oder Hinweis ?

    Vielen Dank so long DerAndere



  • Ich glaube das Verhalten ist nicht genau definiert, was in diesem Fall zurückgegeben werden soll...
    WAS erwartest Du denn?



  • Hallo,

    und schon mal danke für die Antwort (Frage).
    Ich würde gerne den Text haben, der genau diesem Knoten zugeordnet ist.
    Ohne den Text der Child die er eventuell hat.
    Also eine Art InnerknotenText....

    Ich könnte mit InnerXml soetwas "simmulieren", in dem ich mit Substring mir meinen Teil rauschneide...aber das kann es ja nicht sein.

    So long DerAndere



  • Hallo,

    mit der folgenden XPath-Syntax (text() wählt die Textknoten aus) könnte man es so:

    XmlDocument^ doc = gcnew XmlDocument();
        doc->LoadXml(
    	"<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>"
    	"<Abenteuer>"
    		"<Stationen nummer=\"0\" Text=\"Der  erste Test.\">"
    			"<Station nummer=\"1\">nur ein test<Auswahl1 next=\"2\" /><Auswahl2 next=\"3\">eintreten</Auswahl2><Auswahl3 next=\"10\">wieder gehen</Auswahl3></Station>"
    		"</Stationen>"
    	"</Abenteuer>"
    	);
    	XmlElement^ root = doc->DocumentElement;
    	String^ test = root->SelectSingleNode("/Abenteuer/Stationen/Station/text()")->Value;
    

    schreiben. (LoadXml-Einsatz hier nur zum Testen)

    MfG,

    Probe-Nutzer



  • Besten Dank für die Lösung meines Problem funktioniert sehr gut.

    Hier noch meine Umsetzung.

    String ^xmldateilesentest(String ^dateiname,int Station)
    {
       String ^inhalt;
       XmlDocument^ doc = gcnew XmlDocument();
       doc -> Load(dateiname);
        //falls man einen Namensraum hat oder braucht die mit * gekennzeichnet kommentare entfernen
    
        //****XmlNamespaceManager^ nsmgr = gcnew XmlNamespaceManager(doc -> NameTable);
        //****nsmgr -> AddNamespace("dsa", "http://www.test.de");
        XmlNode^ station;
        XmlElement^ root = doc -> DocumentElement;
        station = root -> SelectSingleNode("/Abenteuer/Stationen/Station/text()");
        //****station = root -> SelectSingleNode("/Abenteuer/Stationen/Station/text()",nsmgr);
       inhalt = station->Value;
       return inhalt;
    
    }
    

    So long DerAndere


Anmelden zum Antworten