XML Datei durchsuchen und Wertändern



  • Hallo Leute,

    ich mühe mich jetzt schon ne Zeit damit ab, eine XML datei "vernünftig" zu durchsuchen und einen Wert zu ändern. (Wobei es beim durchlaufen schon scheitert). Ich hab mir einiges in der msdn durchgelsen mit XMLNodes und XMLREader usw.. aber richtig checken tu ich es nicht.

    Irgendwie check ich auch schön langsam das ganze "was ist ein node, was ist ein element usw. " nicht mehr.

    Die Datei sieht ungefähr so aus:

    test.xml:

    <Parameters>
      <Parameter>
        <name> test </name>
        <value> 1 </value>
      </Parameter>
    
      <Parameter>
        <name> test2 </name>
        <value> 2 </value>
      </Parameter>
    
      <Parameter>
        <name> test3 </name>
        <value> 3 </value>
      </Parameter>
    
    </Parameters>
    

    Ich stelle mir das vom Ablauf her so vor, ich möchte jeden Parameter Eintrag durchsuchen ob <name> mein Suchkriterium ist, z.B.: test2 und dann den zugehörigen wert <value> ändern. Hab keinen vernünftigen Code zum Posten, weil alles Spaghetti ist und hasChild oder FirstChildItem auch nicht richtig hergenommen wird, stürzt immer ab.

    Kann mir evlt. jmd. erkälren mit was für "XML-Klassen ... " ich das am besten anstelle ?
    <Parameter> ist doch ein Node oder ?



  • Hab sowas in die Richtung probiert, aber das haut gar nicht hin, bzw. geht an meine Vorstellungen vorbei... :-

    string path = @"testc.xml";
    
                XElement fromFile = XElement.Load(path); 
    
                foreach (XElement xelement in fromFile.Elements() )
    
                    foreach (var v in xelement.Elements()) {
                        foreach (var x in v.Elements()) {
                            Console.WriteLine(x.Name);
                        }
                    }
    


  • Hast du dir mal XPath angeschaut? Damit kann man eigentlich recht komfortabel alles erreichen, was man benötigt.



  • Hab ich auch mal angeguckt, genauso wie XmlNode Class (https://msdn.microsoft.com/en-us/library/System.Xml.XmlNode(v=vs.80).aspx) aber so wirklich weiter kommen tu ich nicht.

    Ich bräuchte mal evtl. von jmd. der das schonmal gemacht hat den richtigen Wink . Hab mir jetzt den Wikipedia Artikel zum XML Aufbau noch 10 mal durchgelesen,

    Wurzelelement wäre hier <Parameters> , sind dann die einzelnen <Parametet> lauter Elemente (nodes) ? Ja, was sind dann <name> und <value> ? ChildNodes ?
    Wenn ich das mal zuordnen könnte auf mein Beispiel, käme ich mit den Klassen auch zurecht... Hoff ich



  • <Parameters>...</Parameters> ist das Dokumentenelement (Wurzelelement), ist aber auch ein Element. <Parameter>...</Parameter> ist ebenfalls ein Element, genauso wie <name>...</name> und <value>...</value> . Letztere sind aber auch Kinder vom Parameter -Tag.

    XML-Elemente sind Knoten, allerdings sind nicht alle XML-Knoten auch Elemente. Weitere XML-Knoten sind Attribute, Text etc. Elemente sind also nur eine Art von Knoten.

    Um in C# alle Parameter -Elemente mit ihren Namen und Werten aufzulisten, könntest zu mithilfe von XPath folgendes tun (ungetestet):

    XMLDocument doc = new XMLDocument();
    doc.Load("dein_dokument.xml");
    XmlNodeList nodeList = doc.SelectNodes("//Parameters/Parameter"); // Selektiert alle Parameter-Elemente
    
    foreach(XmlNode n in nodeList) {
        XmlNode nameNode  = n.SelectSingleNode("name");
        XmlNode valueNode = n.SelectSingleNode("value");
    
        if((nameNode != null) && (valueNode != null)) {
            Console.WriteLine(nameNode.InnerText + ": " + valueNode.InnerText);
        }
    }
    


  • Danke, etwas klarwr ist mir das jetzt.
    Ich kann mit xmlnode in der foreach aber keinen wert ändern oder ? Falls doch muss ich nach dem ändern noch irgendwie speichern oder so ?



  • Hab´s mittlerweile hinbekommen. Falls jmd. auch mal ein Problem damit hat, oder etwas in die Richtung sucht, hier ein guter ARtikel / Link :

    https://support.microsoft.com/de-de/kb/301233/de


Log in to reply