none
Change Value in XML-Document (C#) RRS feed

  • Frage

  • Hi,
    how can I select and change the value "Entwicklung" (bold, unterline) in this XML in C#?
    Thank you
    Regards
    Nicole

    <?xml version="1.0" encoding="utf-8"?>
    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <!-- Pfad zu log-Verzeichnis  -->
      <variable name="logDir"  value="${specialfolder:folder=ApplicationData}/BAMF/Maris/logs"/>
      <variable name="logFile" value="${shortdate}.log"/>
      <variable name="umgebung" value="Entwicklung"/>
    </nlog>

    Montag, 29. April 2013 19:19

Antworten

  • Hallo, ich nehme mal an das du Deutsch kannst, zumal wir hier sowieso in einem deutschen Forum sind ;)

    Du kannst beispielsweise die Datei in ein XDocument laden, danach vom Root mithilfe der Descendant-Methode den Knoten abfragen. Nun musst du noch alle druchgehen bis du deinen richtigen Knoten hast und diesen aknnst du dann ändern und schließlich wieder speichern. Im Code könnte es beispielsweise so aussehen:

                XDocument doc = XDocument.Load("DATEINAME...");//Datei laden
                XElement el = (from x in doc.Root.Descendants("variable")//Knoten ermitteln und einzeln mithilfe von LINQ durchgehen
                               where x.Attribute("name").Value == "umgebung"//Auf den Attributwert abfragen
                               select x).Single();//Element auswählen und schließlich das erste benutzen
                el.SetAttributeValue("value", "Das neue Value...");//Wert setzen
                doc.Save("DATEINAME");//Datei speichern


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Montag, 29. April 2013 20:23
    Moderator

Alle Antworten

  • Hallo, ich nehme mal an das du Deutsch kannst, zumal wir hier sowieso in einem deutschen Forum sind ;)

    Du kannst beispielsweise die Datei in ein XDocument laden, danach vom Root mithilfe der Descendant-Methode den Knoten abfragen. Nun musst du noch alle druchgehen bis du deinen richtigen Knoten hast und diesen aknnst du dann ändern und schließlich wieder speichern. Im Code könnte es beispielsweise so aussehen:

                XDocument doc = XDocument.Load("DATEINAME...");//Datei laden
                XElement el = (from x in doc.Root.Descendants("variable")//Knoten ermitteln und einzeln mithilfe von LINQ durchgehen
                               where x.Attribute("name").Value == "umgebung"//Auf den Attributwert abfragen
                               select x).Single();//Element auswählen und schließlich das erste benutzen
                el.SetAttributeValue("value", "Das neue Value...");//Wert setzen
                doc.Save("DATEINAME");//Datei speichern


    <Code:13/> - Koopakiller [kuːpakɪllɐ]
    Webseite | Code Beispiele | Facebook | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Montag, 29. April 2013 20:23
    Moderator
  • Hi gpc,

    also ich weiss nicht genau was du machen willst....

    Wenn du Unterstrichen und Fett geschrieben im XML Dokument haben willst, das wird nicht klappen, du kannst halt nur wie Koopakiller geschrieben hast Werte setzen oder Attribute anfügen

     <variable name="umgebung" value="Entwicklung" isBold=true/>

    Dienstag, 30. April 2013 13:24
  • Hallo zusammen,

    ich würde das XML-Dokument laden, eine XPath-Abfrage erstellen, die mir den gewünschten Node zurückgibt, und darin würde ich dann den gewünschten Attributwert überschreiben:

    // XML-Dokument laden
    var logFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "log.xml");
    XmlDocument xDoc = new XmlDocument();
    xDoc.Load(logFile);
    
    // Namespaceresolver erstellen
    XmlNamespaceManager namespaceManager = new XmlNamespaceManager(xDoc.NameTable);
    namespaceManager.AddNamespace("bogus", "http://www.nlog-project.org/schemas/NLog.xsd");
    
    // XPath-Abfrage: Aus dem Namespace 'bogus' wähle jenes 'variable'-Element
    // dessen 'name'-Attribut den Wert 'umgebung' und dessen 
    // 'value'-Attribut den Wert 'Entwicklung' aufweisen. var elementEntwicklung = xDoc.SelectSingleNode("//bogus:variable[@name='umgebung' and @value='Entwicklung']", namespaceManager); if (elementEntwicklung != null) { // Attribut-Wert ändern elementEntwicklung.Attributes["value"].Value = "Neu"; // Geändertes XML-Dokument speichern xDoc.Save(logFile); }

    Den XPath-Ausdruck kann man über String.Format("//bogus:{0}[@{1}='{2}' and @{3}='{4}']", elementName, attribut1Name, attribut1Wert, attribut2Name, attribut2Wert) dynamisch erstellen und so mit weiteren Elementen und Attributen wiederverwenden.

    Und falls Du dich ob des "bogus"-Präfixes wundern solltest, hier kommt die Erklärung (die deutsche Übersetzung ist leider unverständlich):

    HOW TO: Specify Namespaces When You Use an XmlDocument to Execute XPath Queries in Visual C#


    Gruß
    Marcel


    Dienstag, 30. April 2013 21:40
    Moderator