XML ändern



  • Ich wollte in einem XML file einen Wert ändern:

    Mein Code sieht so aus:

    public void ChangeTextInCfg(string cFile, string btnIdx, string nText)
            {
                try
                {
                    string cfgFile = ConfigDir + roleFile;
                    XmlDocument xmlFile = new XmlDocument();
    
                    xmlFile.Load(cfgFile);
                    XmlNode xNode = xmlFile.SelectSingleNode("/FUNCTIONKEYS/BUTTONS/BUTTON[@Index='" + btnIdx + "']/FUNCTIONNAME");
                    xNode.InnerText = nText;
    
                }
                catch (Exception e)
                {
                    Console.Error.WriteLine("ERR:The process failed: {0}", e.ToString());
                }
            }
    

    es sieht so aus als ob xNode eine Null refernz wäre.
    Ich verstehe aber nicht wieso, da das XML element existiert.

    Weiß wer ein Toll mit dem ich in einem CML file den XPath überprüfen kann?
    Oder was sonst der fehler sein kann?



  • PKn schrieb:

    Oder was sonst der fehler sein kann?

    Der Fehler ist doch wohl eindeutig: Der xpath liefert kein Ergebnis, ist also entweder falsch oder es existiert kein Button mit der btnIdx.

    Ohne das XML zu kennen kann man da kaum mehr zu sagen.

    PKn schrieb:

    Weiß wer ein Toll mit dem ich in einem CML file den XPath überprüfen kann?

    Seriously, ein Tool? Ich würd sagen: Gehirn einschalten.

    Also, laut deinem Xpath müsste dein XML so aussehen:

    <FUNCTIONKEYS>
       <BUTTONS>
          <BUTTON Index="???">
             <FUNCTIONNAME/>
          </BUTTON>
       </BUTTONS>
    </FUNCTIONKEYS>
    

    (??? = inhalt von btnIdx)

    Wenn das nicht der Aufbau Deines XML ist, dann ist der xpath falsch.

    Ich tipp mal drauf das <FUNCTIONKEYS> in Wirklichkeit nicht deine Rootnode ist. Also entweder den xpath korrigieren oder ne relative Suche machen ( // am Anfang anstatt / )



  • Jop meinte tool 😉

    Sieht mehr so aus

    <?xml version="1.0" encoding="utf-8"?>
    <FUNCTIONKEYS>
       <BUTTONS>
          <BUTTON Index="???">
             <FUNCTIONNAME>HALLO</FUNCTIONNAME>
          </BUTTON>
       </BUTTONS>
    </FUNCTIONKEYS>
    

    --> werds aber mal mit der relativen versuchen.

    Würde das zuweißen passen wenn ich Hallo überschreiben will?
    Muss ich das file nochmal "rausschreiben"?


  • Administrator

    PKn schrieb:

    Würde das zuweißen passen wenn ich Hallo überschreiben will?

    http://msdn.microsoft.com/en-us/library/fb63z0tw.aspx

    MSDN schrieb:

    Return Value
    Type: System.Xml.XmlNode
    The first XmlNode that matches the XPath query or null if no matching node is found. The XmlNode should not be expected to be connected "live" to the XML document. That is, changes that appear in the XML document may not appear in the XmlNode, and vice versa.

    Diese Methode ist somit in erster Linie zur Abfrage gemacht und mehr nicht. Du kannst nicht davon ausgehen, dass du damit etwas im DOM Tree überschreibst.

    PKn schrieb:

    Muss ich das file nochmal "rausschreiben"?

    Wenn du den DOM Tree veränderst, musst du natürlich diesen wieder ins File schreiben. Du tätigst deine Änderungen nicht direkt am File sondern an einer Struktur, welche aus dem File in deinem Arbeitsspeicher erstellt wurde.

    Du solltest dir zudem vielleicht System.Xml.Linq anschauen. Dort kannst du mit XPath Knoten selektieren und erhälst auch wirklich den Knoten in der Struktur. Kannst somit "live" Änderungen durchführen. Natürlich musst du dann trotzdem das File mit deiner veränderten Struktur überschreiben.

    Grüssli


Log in to reply