【问题标题】:Get main element attributes of XML using LINQ使用 LINQ 获取 XML 的主要元素属性
【发布时间】: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); } }

标签: c# xml linq


【解决方案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 值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多