更新特定的XML节点

时间:2014-04-04 22:35:21

标签: c# asp.net xml linq-to-xml

我是XML文件的新手以及如何管理它们。这适用于我正在编写的Web应用程序(aspx)。

目前,我能够找到节点的第一个实例,并使用以下代码向其添加项目:

xmlClone.Element("PCs").Element("PC").Element("pc_hwStatus").AddAfterSelf(new XElement("user_name", txt_v0_nombre.Text));

我真正想要的是将(" user_name",txt_v0_nombre.Text)添加到特定节点,而不是第一个节点。我的XML文件的内容是:

<PCs> 
<PC> 
    <pc_name>esc01</pc_name> 
    <pc_ip>10.10.10.10</pc_ip>
    <pc_hwStatus>Working</pc_hwStatus>
 </PC> 
 <PC> 
    <pc_name>esc02</pc_name>
    <pc_ip>10.10.10.11</pc_ip> 
    <pc_hwStatus>Under Maintenance</pc_hwStatus>
 </PC>
 </PCs>

决定更新哪个节点从下拉列表中选择一个项目(PC名称)。

使用我当前的代码,新项目总是作为&#34; pc_添加为节点的最后一行 name = esc01&#34;。我希望能够将它添加到esc02或esc03等等......如何实现? (使用xdocument)

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您要找的是FirstOrDefault扩展方法。在那里指定你想要的节点,在这种情况下是你的下拉框中的一个字符串,可以传入。所以要获得第一个节点:

var pc = xmlClone.Element("PCs").Elements("PC").FirstOrDefault(e => e.Element("pc_name").Value == "esc01");

现在你的XElement中有这个:

<PC> 
    <pc_name>esc01</pc_name> 
    <pc_ip>10.10.10.10</pc_ip>
    <pc_hwStatus>Working</pc_hwStatus>
</PC> 

要获得类似的任何元素,只需替换此子句:

.FirstOrDefault(e => e.Element("pc_name").Value == "esc01");

这一个

.FirstOrDefault(e => e.Element("pc_name").Value == desiredPC);

其中desiredPC是xml节点的值:pc_name

现在添加数据只需调用普通的Add方法:

pc.Add(new XElement("user_name", txt_v0_nombre.Text);

这应该适合你。

答案 1 :(得分:1)

以下解决方案使用 LINQ查询语法 LINQ to XML:

XDocument document = XDocument.Parse(xmlContent);
string pcName = "esc02";

IEnumerable<XElement> query =
    from pc in document.Element("PCs").Elements("PC")
    where pc.Element("pc_name").Value.Equals(pcName)
    select pc;

XElement xe = query.FirstOrDefault();

if (xe != null)
{
    xe.Add(new XElement("user_name", "DMS"));
}

我已将您的示例数据和此查询合并到演示程序中。请参阅下面的示范程序输出,然后是程序本身。

预期输出

<PC>
  <pc_name>esc02</pc_name>
  <pc_ip>10.10.10.11</pc_ip>
  <pc_hwStatus>Under Maintenance</pc_hwStatus>
  <user_name>DMS</user_name>
</PC>

演示计划

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace LinqToXmlDemo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string xmlContent = GetXml();
            XDocument document = XDocument.Parse(xmlContent);

            XElement xe = FindPCName(document, "esc02");

            if (xe != null)
            {
                xe.Add(new XElement("user_name", "DMS"));
                Console.WriteLine(xe);
            }
            else
            {
                Console.WriteLine("Query returned no results.");
            }
        }

        private static XElement FindPCName(XDocument document, String pcName)
        {
            IEnumerable<XElement> query =
                from pc in document.Element("PCs").Elements("PC")
                where pc.Element("pc_name").Value.Equals(pcName)
                select pc;

            return query.FirstOrDefault();
        }

        private static String GetXml()
        {
            return
                @"<?xml version='1.0' encoding='utf-8'?>
                  <PCs> 
                    <PC> 
                      <pc_name>esc01</pc_name> 
                      <pc_ip>10.10.10.10</pc_ip>
                      <pc_hwStatus>Working</pc_hwStatus>
                    </PC> 
                    <PC> 
                      <pc_name>esc02</pc_name>
                      <pc_ip>10.10.10.11</pc_ip> 
                      <pc_hwStatus>Under Maintenance</pc_hwStatus>
                    </PC>
                  </PCs>";
        }        
    }
}

答案 2 :(得分:0)

方法.Element返回具有指定名称的第一个元素。

您可以使用方法.Elements获取整个列表,并迭代此列表以找到您要查找的列表。