XmlTextReader- Namen Des Knotens bei nicht- Elementknoten auslesen.



  • Ich hab folgendes Problem:

    aus einer XML Datei möchte ich etwas herauslesen, was an der Stelle <title> steht. Z.B.:

    <?xml version="1.0" encoding="utf-8" ?> 
    <Bookdata>
    <lastedit initials="FK">01102005</lastedit>
    <settings>
    	<book> 
    		<location>Dummyloc</location>
    		<title>Der Titel</title>
    	</book>
    </settings>
    </Bookdata>
    

    Nun nehme ich eine Konstruktion, z.B. eine IF anweisung:

    XmlTextReader* xtr = new XmlTextReader(path);
    
    while(xtr->Read())
    	{
    		if(xtr->NodeType == XmlNodeType::Text && xtr->Name == "title")
    		{			
    
    			return xtr->Value;
    		}
    (...)
    

    Leider führt das so zu nichts, da xtr->Name nur bei Elementknoten, nicht aber bei Textknoten (lt. MSDN und meiner leidigen Erfahrung) einen Wert zurückgibt (bei Textknoten einen leeren String).

    Dennoch würde ich gern auf diese Art und Weise (Vergleich des Knotennamens) irgendwie an meine Daten kommen, numerische Vergleich hinsichtl. Verschachtelungstiefe will ich nicht haben, da das XML File sich ncoh ändern kann, ich dann aber nicht allen Code ändern will.

    Ich finde die passende Methode nicht. Gibt es eine?



  • Also eigentlich ist das C++ 😞

    xtr->ReadString()



  • Ja, das ist C++. Aber ReadString liest ja auch nur den Inhalt des Knotens. Ich will aber den Namen des Knotens auslesen.

    Im Prinzip:

    "Wenn Du den Knoten Namens "Title" findest, dann gebe den Inhalt dessen als String zurück."

    Leider scheint das deutlcih komplexer zu sein, als gedacht.



  • Du brauchst eine Klassenvariable, die den Namen des aktuellen Knotens speichert (und evtl. noch den Kontext):

    (Ich poste mal als C# Code, da ich mich in C++.NET vertun könnte, sollte durch austauschen ein paar . und -> portierbar sein 😉 und es geht ja ums Prinzip)

    /* In der Klasse */
    private string aktElement = "";
    
    /* In der Methode
    while(xtr.Read())
    {
        if(xtr.NodeType == XmlNodeType.StartElement)
        {           
            aktElement = xtr.Name;
        }
        else if (xtr.NodeType == XmlNodeType.TextElement && aktElement == "title")
        {
            result = xtr.Value;
        }
        else if (xtr.NodeType == XmlNodeType.EndElement)
        {
            aktElement = "";
        }
    }
    

Anmelden zum Antworten