搜索xml,更改某个节点中的值,在C#中添加新节点

时间:2014-02-04 16:51:02

标签: c# xml search

我正在创建一个应用程序,我想搜索某个节点,并更改该根节点中的值。这就是我的xml的样子:

<Employees>
  <Employee> 
    <name>Name1</name>
    <Enter>0</Enter>
    <log>
      <data Time="02.04.2014 13:00:00" Enter="1" />
      <data Time="02.04.2014 15:00:00" Enter="0" />
    </log>
  </Employee>
  <Employee> 
    <name>Name2</name>
    <Enter>1</Enter>
    <log>
      <data Time="02.04.2014 11:00:00" Enter="1" />
      <data Time="02.04.2014 12:00:00" Enter="0" />
      <data Time="02.04.2014 13:00:00" Enter="1" />
    </log>
  </Employee>
</Employees>

所以,我有一个文本框,我在其中输入员工的姓名,例如Name1。单击按钮后,标记的值将从0更改为1,反之亦然,并且在相同的驯服中,它会添加登录新节点的时间和日期,包括enter字段中的数据。这个想法是一个入口系统,您可以在其中编写名称,如果用户在进入或离开,同时将数据保存为个人日志。

如何根据文本框中的文本搜索xml,找到某个节点后,从enter节点更改值,并将包含当前时间和日期的新节点添加到节点中?

到目前为止,这是我的代码:

XElement root = XElement.Load("data.xml");
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("data.xml");
string xPathString = String.Format("/Employees/Employees/name[.=\"{0}\"]", textBox1.Text);

XmlNodeList nodeList = xmlDoc.SelectNodes(xPathString);
foreach (XmlNode node in nodeList)
{
    DateTime time = DateTime.Parse("02.04.2014 13:00:00");
    XElement data = root.Descendants("data")
        .FirstOrDefault(d => (DateTime)d.Attribute("Time") == time &&
            (int)d.Attribute("Enter") == 1);
    data.Attribute("Time").Value = time.ToString();
    data.Attribute("Enter").Value = 0.ToString();
    root.Save("data.xml");
}
xmlDoc.Save("data.xml");

我是否必须使用XElement和XmlDocument?因为SelectNodes与XmlDocument一起使用,所以不知道任何其他方式。问题是,我如何进入节点等于textbox.text的节点?然后将值更改为并添加新的子项?

1 个答案:

答案 0 :(得分:1)

如果您更容易使用节点,它将使搜索数据变得更容易。我建议像:

<data Time="02.04.2014 13:00:00" Enter="1" />

然后,您可以使用Linq-to-XML

搜索该时间并正确输入值
XElement root = XElement.Load(file); // .Parse(string)
DateTime time = DateTime.Parse("02.04.2014 13:00:00");
XElement data = root.Descendants("data")
      .FirstOrDefault(d => (DateTime)d.Attribute("Time") == time &&
                            (int)d.Attribute("Enter") == 1);

要更改值,请执行以下操作:

data.Attribute("Time").Value = time.ToString();
data.Attribute("Enter").Value = 0.ToString();

然后使用以下命令保存更改:

root.Save(file);

有关如何使用XAttributes为属性创建XElements的全部工作,请务必使用任何搜索引擎查找它们。