【问题标题】:Insert new xml node for specific id c#为特定 id c# 插入新的 xml 节点
【发布时间】:2014-02-05 05:40:33
【问题描述】:

如何添加新节点,其中 id 是文本框中的某个值? 这是我的 xml:

<Students>
   <Student>
     <id>111</id>
     <Value>1</Value>
     <information>
        <data DateTime="02.04.2014 13:00:00" Value="1"/>
     </information>
   </Student>
</Students>

所以我的问题是,我有一个输入学生 ID 的文本框。单击按钮后,我想在信息节点中添加一个新节点,包含该时刻的属性日期和时间。

另一件事是,我希望节点中的 innerText 在每次单击时从 1 更改为 0,反之亦然。所以这将是节点中的第二个属性。

下次我点击时,假设要添加一个新节点,它会添加这个。

     <information>
        <data DateTime="02.04.2014 13:00:00" Value="1"/>
        <data DateTime="02.04.2014 14:00:00" Value="0"/>
     </information>

我怎样才能用 XmlLinq 做到这一点?

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:
    var xdoc = XDocument.Load(path_to_xml);
    var student = xdoc.Root.Elements("Student")
                      .FirstOrDefault(s => (int)s.Element("id") == id);
    
    if (student != null) // check if student was found
    {
        var info = student.Element("information");
        if (info == null) // check if it has information element
        {
            info = new XElement("information");
            student.Add(info); // create and add information element
        }
    
        var lastValue = info.Elements("data")
                            .OrderBy(d => (DateTime)d.Attribute("DateTime"))
                            .Select(d => (int)d.Attribute("Value"))
                            .LastOrDefault(); // get latest value
    
        // create new data element
        var data = 
          new XElement("data", 
            new XAttribute("DateTime", DateTime.Now.ToString("MM.dd.yyyy HH:mm:ss")),
            new XAttribute("Value", lastValue == 0 ? 1 : 0));
    
        info.Add(data); // add data element to information element
        xdoc.Save(path_to_xml); // save file
    }
    

    结果:

    <Students>
      <Student>
        <id>111</id>
        <Value>1</Value>
        <information>
          <data DateTime="02.04.2014 13:00:00" Value="1" />
          <data DateTime="02.05.2014 00:40:18" Value="0" />
        </information>
      </Student>
    </Students>
    

    【讨论】:

    • 如何添加条件,如果 id 不在 xml 中,例如显示一个消息框?我猜它会在 var student = xdoc.Root.Elements("Student") .FirstOrDefault(s => (int)s.Element("id") == id);
    • @user2962759 添加else 部分:if (student != null) { ... } else { show message box }
    【解决方案2】:

    c# 有一个方法可以让你轻松做到这一点:

    XmlNode.InsertAfter 方法

    链接到实际页面:http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.insertafter(v=vs.110).aspx

    不想点击的代码示例:

    using System;
    using System.IO;
    using System.Xml;
    
    public class Sample {
    
    public static void Main() {
    
    XmlDocument doc = new XmlDocument();
    doc.LoadXml("<book genre='novel' ISBN='1-861001-57-5'>" +
                "<title>Pride And Prejudice</title>" +
                "</book>");
    
    XmlNode root = doc.DocumentElement;
    
    //Create a new node.
    XmlElement elem = doc.CreateElement("price");
    elem.InnerText="19.95";
    
    //Add the node to the document.
    root.InsertAfter(elem, root.FirstChild);
    
    Console.WriteLine("Display the modified XML...");
    doc.Save(Console.Out);
    

    } }

    如果您需要找到要插入的特定节点,请查看此

    http://msdn.microsoft.com/en-us/library/h0hw012b(v=vs.110).aspx

    【讨论】:

    • XMLnode 和 Xelement 之间存在差异,OP 需要 xmlLinq 解决方案 +
    • 抱歉,您能详细说明一下吗?
    • @SergeyBerezovskiy 你知道有时候人们只是按下按钮而不理解问题和建议的答案
    • 啊哈,抱歉,出于某种原因,我在 xml 和 linq 之间加了一个斜线。我看看能不能找到更好的答案
    猜你喜欢
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多