2014-04-04 103 views
0

我是XML文件的新手,以及如何管理它们。这是为我写的一个Web应用程序(aspx)。更新特定的XML节点

目前我能找到一个节点的第一个实例,并添加一个项目,然后用下面的代码:

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名称)选择一个项目。

使用我当前的代码,新项目总是作为节点的最后一行添加“pc_ name = esc01”。我希望能够将它添加到esc02或esc03等等......这怎么能够完成? (使用xdocument)

回答

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节点的值:​​3210。

我们添加数据只是调用普通的老Add方法:

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

这应该为你做的伎俩。

0

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

您可以使用方法.Elements获得整个列表,并重复此列表以找到您要查找的列表。

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>"; 
     }   
    } 
}