通过 System.Linq 获取 C# 中元素的属性名称和值
本文关键字:属性 元素 Linq System 获取 通过 | 更新日期: 2023-09-27 18:35:06
我有一个自定义配置文件。
<Students>
<student>
<Detail Name="abc" Class="1st Year">
<add key="Main" value="web"/>
<add key="Optional" value="database"/>
</Detail>
</student>
</Students>
我通过 IConfigurationHandler 接口实现读取了此文件。当我读取 Detail 元素的子节点属性时。它将我下面的结果返回到 IDE 的即时窗口。
elem.Attributes.ToObjectArray()
{object[2]}
[0]: {Attribute, Name="key", Value="Main"}
[1]: {Attribute, Name="value", Value="web"}
当我尝试在控制台上编写时
Console.WriteLine("Value '{0}'",elem.Attributes.ToObjectArray());
它确实回报了我
Value : 'System.Configuration.ConfigXmlAttribute'
elem.Attributes.Item(1)
方法给了我名称和值的详细信息,但在这里我需要传递我目前不知道的属性的索引值。
我想通过 LINQ 查询和控制台上每个子节点属性的单独显示来获取属性的名称和值,如下所示:
Value : Name="Key" and Value="Main"
Name="value", Value="web"
我怎样才能做到这一点?
如果你想使用这个XML库,你可以用下面的代码获取所有学生和他们的详细信息:
XElement root = XElement.Load(file); // or .Parse(string)
var students = root.Elements("student").Select(s => new
{
Name = s.Get("Detail/Name", string.Empty),
Class = s.Get("Detail/Class", string.Empty),
Items = s.GetElements("Detail/add").Select(add => new
{
Key = add.Get("key", string.Empty),
Value = add.Get("value", string.Empty)
}).ToArray()
}).ToArray();
然后使用以下命令遍历它们:
foreach(var student in students)
{
Console.WriteLine(string.Format("{0}: {1}", student.Name, student.Class));
foreach(var item in student.Items)
Console.WriteLine(string.Format(" Key: {0}, Value: {1}", item.Key, item.Value));
}
您可以使用 Linq Select 和字符串。加入以获取所需的输出。
string.Join(Environment.NewLine,
elem.Attributes.ToObjectArray()
.Select(a => "Name=" + a.Name + ", Value=" + a.Value)
)
这将获取您在问题中所述的 Detail 元素子元素的所有属性。
XDocument x = XDocument.Parse("<Students> <student> <Detail Name='"abc'" Class='"1st Year'"> <add key='"Main'" value='"web'"/> <add key='"Optional'" value='"database'"/> </Detail> </student> </Students>");
var attributes = x.Descendants("Detail")
.Elements()
.Attributes()
.Select(d => new { Name = d.Name, Value = d.Value }).ToArray();
foreach (var attribute in attributes)
{
Console.WriteLine(string.Format("Name={0}, Value={1}", attribute.Name, attribute.Value));
}
如果你在
你写的object[]
中有属性,这可以被嘲笑
var Attributes = new object[]{
new {Name="key", Value="Main"},
new {Name="value", Value="web"}
};
那么问题是您有匿名类型,其名称无法轻松提取。
看看这段代码(你可以把它粘贴到 LinqPad 编辑器窗口的 main() 方法中来执行它):
var linq=from a in Attributes
let s = string.Join(",",a).TrimStart('{').TrimEnd('}').Split(',')
select new
{
Value = s[0].Split('=')[1].Trim(),
Name = s[1].Split('=')[1].Trim()
};
//linq.Dump();
由于您无法访问 object[] 数组中变量属性的 Name 和 Value 属性,因为编译器对您隐藏了它们,因此这里的诀窍是使用 Join(",", a) 方法来绕过此限制。
之后您需要做的就是修剪和拆分生成的字符串,最后创建一个具有 Value 和 Name 属性的新对象。如果您取消注释 linq,则可以尝试一下。转储();行 - 它返回您想要的内容,并且可以通过 Linq 语句进一步查询。