通过 Linq 到 XML 获取父节点的属性值
本文关键字:属性 父节点 获取 Linq XML 通过 | 更新日期: 2023-09-27 18:36:25
我在使用 Linq to XML 解析 XML 文件时遇到问题。
我的 XML 结构如下所示:
<Module>
<Variable Name="Variable1" Value="True" />
<Variable Name="Variable2" Value="True" />
<Variable Name="Variable3" Value="True" />
</Task>
<Task Name="Task1">
<Variable Name="Task1Variable1" Value ="True" />
<Variable Name=" Task1Variable2" Value ="True" />
</Task>
<Task Name="Task2">
<Variable Name="Task2Variable1" Value ="True" />
<Variable Name=" Task2Variable2" Value ="True" />
</Task>
</Module>
我打算做的是获取每个变量名称属性的值。因此,对于直接位于节点模块下的元素,它可以正常工作
var variables = (from cfg in _xElements.Descendants("Module").Elements("Variable")
select cfg.Attribute("Name"));
问题从任务节点下的变量名称属性开始,因为我还需要有关任务名称的信息。
因此,我想获得的是有关变量名称的信息以及有关任务名称的信息,该任务名称是变量元素的父节点。
有没有办法用 Linq 完成这项工作?
您可以使用 XElement 的父属性
var variables = (from cfg in _xElements.Descendants("Variable")
select new
{
TaskName = cfg.Parent.Name == "Task"? cfg.Parent.Attribute("Name"):null,
VariableAttribute = cfg.Attribute("Name")
});
当前代码的问题在于,由于您使用的是 Elements,因此它只返回作为根节点直接子节点的Variable
。请改用 Descedants。
此查询将为您提供预期的输出:-
var variables = (from cfg in _xElements.Descendants("Variable")
select cfg.Attribute("Name"));
检查元素和子体之间的差异。
在这种情况下,后代将不起作用。 尝试完整的解决方案
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string xml =
"<Module>" +
"<Variable Name='"Variable1'" Value='"True'" />" +
"<Variable Name='"Variable2'" Value='"True'" />" +
"<Variable Name='"Variable3'" Value='"True'" />" +
"<Task Name='"Task1'">" +
"<Variable Name='"Task1Variable1'" Value ='"True'" />" +
"<Variable Name='"Task1Variable2'" Value ='"True'" />" +
"</Task>" +
"<Task Name='"Task2'">" +
"<Variable Name='"Task2Variable1'" Value ='"True'" />" +
"<Variable Name='"Task2Variable2'" Value ='"True'" />" +
"</Task>" +
"</Module>";
XDocument doc = XDocument.Parse(xml);
var results = doc.Elements("Module").Select(m => new {
variables = m.Elements("Variable").Select(n => new {
name = (string)n.Attribute("Name"),
value = (string)n.Attribute("Value")
}).ToList(),
tasks = m.Elements("Task").Select(o => new {
name = (string)o.Attribute("Name"),
variables = o.Elements("Variable").Select(p => new {
name = (string)p.Attribute("Name"),
value = (string)p.Attribute("Value")
}).ToList()
}).ToList()
}).FirstOrDefault();
}
}
}