2014-02-26 27 views
0

我想添加一个新节点到我的xml文件,但是,我想添加id值,但是从最后一个值加1。下面是我的XML:在xml文件中自动增加ID值

<users> 
     <user> 
     <id>1</id> 
     <name>Name1</name> 
     <surname>Surname1</surname> 
     <weight>78</weight> 
     <height>180</height> 
     </user> 
     <user> 
     <id>2</id> 
     <name>Name2</name> 
     <surname>Surname2</surname> 
     <weight>84</weight> 
     <height>180</height> 
     </user> 
    </users> 

这里是我到目前为止的代码(添加一个新的节点):

 XmlNode node = xmlDoc.SelectSingleNode("https://stackoverflow.com/users/user"); 
     XmlNode newNode = xmlDoc.ImportNode(node, true); 
     xmlDoc.DocumentElement.AppendChild(newNode); 

     xmlDoc.SelectSingleNode("users/user/id").InnerText = ; // <-- ?? 
     xmlDoc.SelectSingleNode("users/user/name").InnerText = nameBox.Text; 
     xmlDoc.SelectSingleNode("users/user/surname").InnerText = surnameBox.Text; 
     xmlDoc.SelectSingleNode("users/user/weight").InnerText = Convert.ToString(weightUpDown.Value); 
     xmlDoc.SelectSingleNode("users/user/height").InnerText = Convert.ToString(heightUpDown.Value); 

我使用的WinForms在C#中,在这种情况下得到的文本价值框和UpDown列表。 如何在c#中执行此操作?

+1

ü必须先阅读并添加新条目之前保存的最后一个ID。 – Prix

回答

4

可以使用LINQ to XML为that.First获得当前的元素个数,然后插入这样一个新的元素:

var xDoc = XDocument.Load("path"); 
var count = xDoc.Descendants("user").Count(); 
var newUser = new XElement("user", 
        new XElement("id", count+1), 
        new XElement("name", nameBox.Text), 
        new XElement("surname", surnameBox.Text), 
        new XElement("weight", weightUpDown.Value), 
        new XElement("height", heightUpDown.Value)); 
xDoc.Root.Add(newUser); 
xDoc.Save(path); 

我建议你得到第一个元素(也许在Form_load中)计数然后存储它变成一个变量。通过这样做,您不需要在每次添加新项目时都执行此查询。您只需要增加计数。

+0

这是假设ID是连续的。 – Prix

0

我想我需要一些更多的信息.​​..

乍一看它看起来像你需要做到以下几点:

  1. 迭代/通过值文本框环和/或UpDown列表。
  2. 确保您的循环具有在循环“int counter = 1”之外创建的计数器变量。
  3. 对于您要迭代的每个项目,使用计数器在您生成的xml中设置id。
  4. 项目之前,要追溯到循环,那么你应该增加计数器+ 1

你会自动填充与值每个节点反正正确吗?

所有你需要的是添加这个计数器变量,你应该基本上有你需要的东西。

1

你可以得到最大的ID如下:

var maxId = xmlDoc.SelectNodes("https://stackoverflow.com/users/user/id") 
       .Cast<XmlNode>() 
       .Max(node => int.Parse(node.InnerText)); 
0

使用计数,以确定是否节点从XML程序的执行过程中删除,ID不能正常工作。

使用Guid.NewGuid(),而不是创建一个唯一的ID