我是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)
答案 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
获取整个列表,并迭代此列表以找到您要查找的列表。