如何使用LINQ-TO-XML获取指定属性值(排除自闭合节点)
用LINQ to XML提取非自闭合节点的add属性值
没问题,这事儿用LINQ to XML轻松就能实现,我给你一步步拆解,顺便解答你关于属性操作方法的疑问。
先看示例XML结构
假设你的XML文件大概是这样的(符合你需求的典型结构):
<root> <item add="abc1">Some content</item> <element add="xyz1"> <child>Inner text</child> </element> <self-closing-node add="should-ignore" /> <!-- 这个自闭合节点要排除 --> <number add="10">Numeric value</number> </root>
实现代码(C#)
下面的代码会精准提取你要的属性值:
using System.Linq; using System.Xml.Linq; // 加载XML文件(如果是XML字符串可以用XDocument.Parse()替代) XDocument xmlDoc = XDocument.Load("your-file-path.xml"); // 提取目标属性值的核心查询 var addAttributeValues = xmlDoc.Descendants() // 过滤掉自闭合节点:IsEmpty为true的就是自闭合节点 .Where(node => !node.IsEmpty) // 获取这些节点上名为"add"的属性 .Attributes("add") // 提取属性的字符串值 .Select(attr => attr.Value) // 转成List方便后续使用 .ToList();
执行这段代码后,addAttributeValues就是包含abc1、xyz1、10的列表,完全符合你的预期。
关于属性操作的等效方法
你问有没有和Descendants()等效的属性遍历方法?其实LINQ to XML并没有提供直接的DescendantAttributes()方法,但我们可以通过Descendants().Attributes()的组合来实现类似效果——就像上面代码里的写法,先遍历所有后代节点,再筛选目标属性。
如果想直接遍历整个文档里的所有add属性(不管节点是否自闭合),可以简化成:
var allAddAttributes = xmlDoc.Descendants().Attributes("add").Select(a => a.Value).ToList();
但因为你需要排除自闭合节点,所以先加Where(node => !node.IsEmpty)的筛选是必要的。
内容的提问来源于stack exchange,提问作者Bumba
相关产品推荐
相关产品推荐

