C# 终极目标。 <?xml version="1.0" encoding="utf-8" standalone="no"?> <root> <key name="some text" id="1"/>

C# 终极目标。 <?xml version="1.0" encoding="utf-8" standalone="no"?> <root> <key name="some text" id="1"/> ,c#,xml,linq,xelement,setvalue,C#,Xml,Linq,Xelement,Setvalue,终极目标。 <?xml version="1.0" encoding="utf-8" standalone="no"?> <root> <key name="some text" id="1"/> <key name="some text" id="2"/> <house id="H1"> <floor id="F1"> <room id="R1"

终极目标。
    <?xml version="1.0" encoding="utf-8" standalone="no"?>
<root>
    <key name="some text" id="1"/>
    <key name="some text" id="2"/>
    <house id="H1">
        <floor id="F1">
            <room id="R1">Child1<electrics><socket id="C1S1"/></electrics></room>
            <room id="R2">Child2<electrics><socket id="C2S1"/></electrics></room>
        </floor>
    </house>
</root>
    <?xml version="1.0" encoding="utf-8"?>
<root>
  <key name="some text" id="1" />
  <key name="some text" id="2" />
  <house id="H1">
    <floor id="F1">
      <room id="R1">Child1<electrics><socket id="C1S1" /></electrics></room>
      <room id="R2">Child2<electrics><socket id="C2S1" /></electrics></room>
      <room id="R1">Whatever<electrics><socket id="new room" /></electrics></room>
    </floor>
  </house>
</root>
    using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.Xml.Linq;

namespace linqxmlTester
{
    public partial class Form1 : Form
    {
        private XElement xmlDoc;

        public Form1()
        {
            InitializeComponent();
        }

        private void btnStart_Click(object sender, EventArgs e)
        {

            xmlDoc = XElement.Load("house.xml");

            // Select rooms to clone I realy only want to selekt one room, but I have to go over rooms
            IEnumerable<XElement> newRoom = from rooms in xmlDoc.Element ("house")
                                                                .Element ("floor")
                                                                .Elements("room")

                                                    where rooms.ToString().IndexOf("C1S1") > 0

                                                    select rooms;
            // I've selected realy one room in rooms with the following I clone beheind last room
            xmlDoc.Element ("house")
                  .Element ("floor")
                  .Elements("room").Last()
                  .AddAfterSelf(newRoom.First()); // there is only one

            // This worked   :-)

            //But now I want to change socket id value (="C1S1") to something new
            //I select my last created room

            XElement newRoom1 = xmlDoc.Element("house")
                                      .Element("floor")
                                      .Elements("room").Last();

            //within the newRoom1 I search for the attribute id

            foreach (var r in newRoom1.Elements("electrics").Elements("socket"))
            {
                Debug.WriteLine("aktValue " + r.Attribute("id").Value);
                r.Attribute("id").Value = "new room";
                Debug.WriteLine("newValue " + r.Attribute("id").Value);
            }

            // this is working too :-)

            // Now I only still have to change the value of my newroom
            // it should be the following code

            Debug.WriteLine("OldValue " + newRoom1.Value); // prints only the value without the embeded xml tags

            newRoom1.SetValue("Whatever"); // this kills the complete xml structure with is embede at the side of the value

            Debug.WriteLine("NewValue " + newRoom1.Value); // prints only the newvalue without the embeded xml tags

            xmlDoc.Save("housenew.xml");
        }
}
}
* Element: room (with attribute id)
|- Text: Child1
|- Element: electrics
   |- Element: socket (with attribute id)
newRoom1.Nodes().First().ReplaceWith("Whatever");