Announcement

Collapse
No announcement yet.

Den Wert eines bestimmten XML-Tags setzen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Den Wert eines bestimmten XML-Tags setzen

    Hallo,
    als C# Neuling schlage ich mich schon den ganzen Tag damit rum den Wert eines DEFINIERTEN XML-Tags zu setzen. Sollte also soviel sein wie suche den Knoten my:Mitarbeiter_Vorname und trage dort einen Wert ein (z.B. Thomas) ein.
    Hört sich für mich nach nem Zweizeiler mit XMLTextReader bzw. -Writer an. Trotzdem, es klappt nicht. Was muss ich machen um den Wert des Tags my:Mitarbeiter_Vorname zu setzen?

    Vielen Dank für euern Tipp!

    P.S. Hier die XML-Datei:
    <?xml version="1.0" encoding="UTF-8"?>
    <?mso-infoPathSolution solutionVersion="1.0.0.9" productVersion="12.0.0" PIVersion="1.0.0.0" href="file:///C:\Documents%20and%20Settings\Administrator\My%20D ocuments\InfoPathFormulare\testformular.xsn" name="urn:schemas-microsoft-comffice:infopath:testformular:-myXSD-2008-05-26T12-52-18" ?>
    <?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?>
    <my:meineFelder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2008-05-26T12:52:18" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="de">
    <my:mitarbeiterID>
    </my:mitarbeiterID>
    <my:Mitarbeiter_Vorname>
    </my:Mitarbeiter_Vorname>
    </my:meineFelder>

  • #2
    Tut mir leid, so einfach geht es nicht. Du musst zunächst die gesamte xml-Datei einlesen (z.B. als XmlDocument), dann gezielt zu der gewünschten Stelle springen, dann Wert ändern und alles speichern. Jürgen

    PS. Bitte markiere Code (auch xml) als solchen, das liest sich besser.

    Comment


    • #3
      Ok, verstanden. Dokument im Speicher laden, Wert verändern und den Speicher wieder in die Datei speichern.
      Habe mich heute nochmal mit Ruhe dran gesetzt und nun endlich was lauffähiges zu stande gebracht. Dabei habe ich mich natürlich an vorhandenen Beispielen orientiert.

      Ein Problem habe ich jedoch noch. Der bisherige Code untersucht mit der Bedingung
      foreach (XPathNavigator nav in navigator.Select("//my:meineFelder/*", manager))
      jede Zeile und handelt entsprechend. Wenn ich den Code verwende, weiß ich aber z.b. schon, dass ich den Wert //my:meineFelder/my:Mitarbeiter_Vorname verändern will.
      Wie mache ich das ohne Verwendung der ForEach SChleife? Mein bisheriges Ergebnis funktioniert nicht.

      Hier mein Code:
      Code:
      XmlDocument document = new XmlDocument();
      document.Load("EditInfoPath.xml");
      XPathNavigator navigator = document.CreateNavigator();
      XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
      manager.AddNamespace("my", "http://schemas.microsoft.com/office/...05-26T12:52:18");
      /*
      //Folgende beiden Zeilen sind falsch:
      XPathNavigator nav = navigator.Select("//my:meineFelder/my:mitarbeiterID", manager);
      nav.SetValue("Mathias");
      */
       
      foreach (XPathNavigator nav in navigator.Select("//my:meineFelder/*", manager))
      {
      if (nav.Value == "")
      {
      Console.WriteLine(1);
      nav.SetValue("Mathias");
      }
      }
      Console.WriteLine(navigator.OuterXml);
      document.Save("EditInfoPath.xml");
      Vorab vielen Dank für die Hilfe!
      Grüße!

      Comment


      • #4
        Warum so kompliziert?

        Code:
        XmlDocument document = new XmlDocument();
        document.Load("EditInfoPath.xml");
        XmlNode node = doc.DocumentElement.SelectSingleNode("meineFelder/mitarbeiterID");
        if(node!=null) node.InnerText="Mathias";
        document.Save("EditInfoPath.xml");

        Gruß
        Peter

        Comment


        • #5
          Hallo Peter,
          vielen Dank für deine Antwort und den kompakten Code!
          Leider gibt es ein Problem. Mein Formular arbeitet InfoPath bedingt mit Namespaces. Sobald ich Namespaces benutze, muss offensichtlich noch der XMLNameSpaceManager eingebunden werden.
          Leider weiß ich mangels Programmiererfahrung nicht, wie ich den XMLNameSpaceManager an XMLNode node anhänge, so dass dein Beispiel mit meinem Dokument kompatibel wird. Kannst du mir die richtige Zeile Code verraten?
          Ich bedanke mich vorab!
          Grüße!

          Comment


          • #6
            Hallo Stoepsel,

            (wäre schön wenn die Leute hier mit einem richtigen Namen unterschreiben würden)

            Leider weiß ich mangels Programmiererfahrung nicht, wie ich den XMLNameSpaceManager an XMLNode node anhänge,
            SelectSingleNode kennt eine Überladung, die einen NameSpaceManager akzeptiert.

            Bei MSDN findet man zu SelectSingleNode

            XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
            nsmgr.AddNamespace("ab", "http://www.lucernepublishing.com");
            XmlNode book = doc.SelectSingleNode("//ab:book", nsmgr);
            Dort gibt es weitere Infos zu Namespaces.

            HTH
            Peter

            Comment

            Working...
            X