使用 LINQ 获取 XML 的主要元素属性

Posted

技术标签:

【中文标题】使用 LINQ 获取 XML 的主要元素属性【英文标题】:Get main element attributes of XML using LINQ 【发布时间】:2021-05-29 16:14:12 【问题描述】:

我需要检索主节点的属性,但我的代码没有打印任何内容。

<MAINNODE AONE="22 11 12" ATWO="444"><CHILDNODE Aone="7"/></MAINNODE>

这是代码:

var listItems = xdocument.Root
.Elements("MAINNODE")
.Select(e => e.Attribute("AONE"))
.Select(a => a.Value.Split(' ').Select(s => XmlConvert.ToInt32(s)).ToList())
.ToList();
foreach (List<int> list in listItems)

    print(list);

我能够获取子节点的属性,但不能获取主节点的属性。我是 LINQ 和 XML 的新手。

【问题讨论】:

如果这是整个XML,那么Root就是主节点,你可以通过xdocument.Root.Attributes获取它的属性。 应该是:.Elements("MAINNODE") 你缺少双引号 是的,刚刚编辑谢谢 Elements("MAINNODE") 查找名为 MAINNODE 的根节点的 children void Main() var xml = @"主节点>"; var listItems = XElement.Parse(xml) .DescendantsAndSelf("MAINNODE") .Select(e => e.Attribute("AONE")) .Select(a => ((string)a).Split(' ')) .SelectMany(s => s.Select(x => int.Parse(x))) .ToList(); foreach(listItems 中的 var 列表) Console.WriteLine(list); 【参考方案1】:

如果这是整个XML,那么Root就是主节点,你可以通过xdocument.Root.Attributes获取它的属性:

string[] listItems = xdocument.Root.Attribute("AONE").Value.Split();
int[] intItems = Array.ConvertAll(listItems, s => Int32.Parse(s));
foreach (int i in intItems) 
    Console.WriteLine(i);

这将打印出来

22 11 12

另请参阅:Array.ConvertAll<TInput,TOutput>(TInput[], Converter<TInput,TOutput>) Method


注意:如果需要列表,可以从int[] intItems 数组中创建一个

var list =  new List<int>(intItems);

或者,不先将字符串数组转换为int数组,直接在调用构造函数时进行转换:

var list = new List<int>(listItems.Select(s => Int32.Parse(s)));

【讨论】:

Int32.Parse() 已本地化,因此在所有语言环境中的行为可能不一致。相反,XmlConvert.ToInt32() 保证正确解析 xs:int 值。

以上是关于使用 LINQ 获取 XML 的主要元素属性的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 LINQ 在 XML 中按名称获取元素

在 C# 中使用 Linq 从 XML 获取属性和属性

使用 LINQ 从 XML 获取三个输入中的最大属性值

如何使用 LINQ to XML 获取属性值?

有没有更快的方法来检查 LINQ to XML 中的 XML 元素?

LINQ to XML:如何在 C# 中获取元素值?