【问题标题】:Search xml, change value in certain node, add new node in C#搜索 xml,更改某个节点中的值,在 C# 中添加新节点
【发布时间】:2014-02-04 16:51:01
【问题描述】:

我正在创建一个应用程序,我想在其中搜索某个节点,并更改该根节点中的值。这就是我的 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,反之亦然,同时添加登录新节点的时间和日期,包括输入字段中的数据。这个想法是一个输入系统,您可以在其中写下用户的姓名,如果用户进出,同时它会将数据保存为个人日志。

如何在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 的节点?然后将值更改为并添加新的孩子?

【问题讨论】:

  • 如果无法选择按钮的放置位置,建议放在文本框右侧
  • 我想要的是在xml中搜索,根据文本框中的文本,在中找到某个节点后,从enter节点更改值,然后将具有当前时间和日期的新节点添加到节点中。我写了实例Name1,Enter的值从0变为1,同时在节点中增加了一个新的节点
  • @user2962759 到底是什么给你带来了问题?从 UI 读取值?解析xml?更新xml中的值?显示您的代码
  • 我是 xml 新手,真的不知道如何开始,读取和保存 xml 就可以了,获取内部文本应该类似于 string xPathString = String.Format(" /Employees/Employee/Name[.=\"{0}\"]]", texbox1.Text);所以我感谢任何帮助
  • 之后,如何找到Enter节点,并将其更改为innerText,然后将其保存到中的新节点中

标签: c# xml search


【解决方案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 的工作有很多,请务必使用任何搜索引擎查找它们。

【讨论】:

  • 这很好,现在,我怎样才能搜索到在文本框中输入名称的节点?然后更改 中的值并添加新的 节点?
  • XElement root = XElement.Load("data.xml"); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("data.xml"); string xPathString = String.Format("/Employees/Employee/Name[.=\"{0}\"]", textBox1.Text); XmlNodeList nodeList = xmlDoc.SelectNodes(xPathString); foreach (XmlNode node in nodeList) { } 我是否必须使用 XElement 和 XmlDocument,因为 XmlDocument 中使用了 SelectNodes?对吗?
  • 问题是,我怎样才能进入 节点等于 textbox.text 的节点?然后将值更改为 并在 中添加新的 子级?
  • @user2962759 您需要对使用 Linq-to-xml 进行更多研究。您拥有的 XPath 表达式是可以的,但通常有更好的方法使用 Linq-to-xml。如果必须包含 System.Xml.XPath,可以将 XPath 与 Linq-to-xml 一起使用
猜你喜欢
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多