Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新特定的XML节点_C#_Asp.net_Xml_Linq To Xml - Fatal编程技术网

C# 更新特定的XML节点

C# 更新特定的XML节点,c#,asp.net,xml,linq-to-xml,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文件以及如何管理它们。这是我正在编写的一个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>

esc01
10.10.10.10
工作
esc02
10.10.10.11 
维修中
从下拉列表中选择一个项目(PC名称)来决定更新哪个节点

在我的当前代码中,新项目始终添加为带有“pc”的节点的最后一行_
名称=esc01”。我想能够添加到esc02或esc03等。。。如何做到这一点?(使用xdocument)

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


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

如果我理解正确,您要查找的是
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 == desiredPC);
其中,
desiredPC
是xml节点的值:
pc\u name

现在要添加数据,只需调用普通的旧
add
方法:

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

这应该对您有帮助。

这里有一个解决方案,它使用LINQ查询语法LINQ to XML:

XDocument document=XDocument.Parse(xmlContent);
字符串pcName=“esc02”;
IEnumerable查询=
来自文件中的pc。元素(“pc”)。元素(“pc”)
其中pc.Element(“pc_name”).Value.Equals(pcName)
选择pc;
XElement xe=query.FirstOrDefault();
如果(xe!=null)
{
添加(新的XElement(“用户名”、“DMS”);
}
我已将您的示例数据和此查询合并到演示程序中。请参见下面的演示程序输出以及程序本身

预期产出


esc02
10.10.10.11
维修中
DMS
演示计划

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Xml.Linq;
名称空间LinqToXmlDemo
{
公共课程
{
公共静态void Main(字符串[]args)
{
字符串xmlContent=GetXml();
XDocument document=XDocument.Parse(xmlContent);
XElement xe=FindPCName(文件“esc02”);
如果(xe!=null)
{
添加(新的XElement(“用户名”、“DMS”);
控制台写入线(xe);
}
其他的
{
WriteLine(“查询没有返回结果”);
}
}
私有静态XElement FindPCName(XDocument文档,字符串pcName)
{
IEnumerable查询=
来自文件中的pc。元素(“pc”)。元素(“pc”)
其中pc.Element(“pc_name”).Value.Equals(pcName)
选择pc;
返回query.FirstOrDefault();
}
私有静态字符串GetXml()
{
返回
@"
esc01
10.10.10.10
工作
esc02
10.10.10.11 
维修中
";
}        
}
}
pc.Add(new XElement("user_name", txt_v0_nombre.Text);