Element in XML Datei finden



  • Hallo,

    ein ganz einfaches Problem:
    Ich habe eine XML-Datei. Diese hat irgendwo genau ein Element wie zum Beispiel das hier:
    <DATAFILE TESTFILE-DATAFILE="false">JZWDJD_23.txt</DATAFILE>

    Ich muss nur dieses Element finden, und den Wert da bekommen.
    Ich möchte das ganz easy mit System.Xml lösen, komme komme aber nicht an das Element heran. Wie kann ich denn ganz einfach sagen, "gehe alle Elemente durch, wenn eines heisst wie..., dann nehme den wert den er enthält"? Danke



  • Nachtrag: Je nach XML-Datei, kann das Element wieder an ganz anderer Stelle stehen. Der Name ist aber immer gleich, und es kommt genau nur 1 mal vor. Was anders sein kann ist das false, es könnte auch true sein.



  • Ich würde dazu die Klasse XmlDocument benutzen und dann mit SelectNodes(..) oder SelectSingleNode(..) die entsprechenden Elemente selektieren.

    http://msdn.microsoft.com/de-de/library/system.xml.xmldocument.aspx

    [EDIT]
    Hier noch ein Bsp.

    <?xml version="1.0" encoding="utf-8" ?>
    <A>
      <B>
        <C>
          <DATAFILE TESTFILE-DATAFILE="false">JZWDJD_23.txt</DATAFILE>
        </C>
      </B>
    </A>
    
    using System;
    using System.Xml;
    
    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                XmlDocument document = new XmlDocument();
                document.Load(@"..\..\Test.xml");
                XmlNode node = document.SelectSingleNode("//DATAFILE");
                XmlElement element = (XmlElement)node;
                string s = element.InnerText;
            }
        }
    }
    


  • Hallo theta,

    das funktioniert einwandfrei 🙂 Vielen Dank.
    Ich hatte es bisher mit folgendem Snippet probiert:

    XmlDocument XmlDoc = new XmlDocument();
    XmlDoc.Load(xmlFile);
    XmlNodeList tagCont= XmlDoc.GetElementsByTagName("DATAFILE");
    

    Im Debugger habe ich gesehen, dass das was ich suche in tagCont steckt, ich aber nicht an die Daten gekommen bin...

    Egal, ich nehme natürlich deine Lösung. Vielen Dank...



  • Im Debugger habe ich gesehen, dass das was ich suche in tagCont steckt, ich aber nicht an die Daten gekommen bin...

    tagCont ist vom Type XmlList - über die kannst Du iterieren - es stecken nur Elemente mit dem Namen "DATAFILE" drin. Laut deiner Ausage, sollte also genau ein Elemnt drin sein:

    Hier ein Bsp.

    using System;
    using System.Xml;
    using System.Diagnostics;
    
    namespace Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                XmlDocument document = new XmlDocument();
                document.Load(@"..\..\Test.xml");
                XmlNodeList nodes = document.GetElementsByTagName("DATAFILE");
    
                // für alle Nodes in der Liste
                {
                    foreach (XmlNode node in nodes)
                    {
                        XmlElement element = (XmlElement)node;
                        string s = element.InnerText;
                    }
                }
    
                // für die erste Node in der Liste
                {
                    // mindestens eine Node muss in der Liste sein
                    Debug.Assert(nodes.Count > 0);
    
                    XmlNode node = nodes[0];
                    XmlElement element = (XmlElement)node;
                    string s = element.InnerText;
                }
            }
        }
    }
    


  • Ja genau, es war nur einer drin, hab versucht den direkt anzusprechen (ohn Ietration) an der Stelle 0, hat mir diverse Sachen geliefert aber nicht den Inhalt. ist ja auch egal, deine Lösung erfüllt alle Wünsche.

    Danke ich kopier mir das für die Zukunft 🙂



  • Hallo,

    nun habe ich ein neues Problem, bei dem die alte Lösung nicht passt.
    Die XML sieht folgendermaßen aus (vereinfacht):

    <?xml version="1.0" encoding="utf-8"?>
    <ABC MODEL-VERSION="[b]2.2.0[/b]" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="odx.xsd">
    .... Viele andere Elemente/Unterelemente ...
    </ABC>
    

    Habe ein wenig herumprobiert. An den Knoten ABC komme ich ja heran, nur wie komme ich an den Wert 2.2.0 von MODEL-VERSION ran?



  • Habe ein wenig herumprobiert. An den Knoten ABC komme ich ja heran, nur wie komme ich an den Wert 2.2.0 von MODEL-VERSION ran?

    Wenn Du den Knoten ABC hast musst Du die Attribute von diesem Auslesen (es gibt ein Property Attributes).

    Simon


  • Administrator



  • XmlNode Node = XmlDoc.SelectSingleNode("//ABC");
    XmlElement Elem = (XmlElement)Node;
    XmlAttributeCollection AttrColl = Elem.Attributes;
    string ModVers = AttrColl.GetNamedItem("MODEL-VERSION").Value;
    

    Super, vielen Dank euch beiden, so klappt das ja 🙂



  • XmlNode Node = XmlDoc.SelectSingleNode("//ABC");
    XmlAttributeCollection AttrColl = Node.Attributes;
    string ModVers = AttrColl.GetNamedItem("MODEL-VERSION").Value;
    

    Sorry, die eine Zeile war natürlich überflüssig 🙂


Log in to reply