2014-04-04 151 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>"; 
     }   
    } 
}