You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何对IEnumerable<XElement>的根元素进行XPath过滤?

C#中对IEnumerable集合执行XPath过滤的方法

嘿,我来帮你搞定这个问题!你现在有一堆<Location>元素的集合,每个里面都有<Type>节点,想要用XPath来筛选特定类型的元素对吧?

首先,你得记得引用System.Xml.XPath这个命名空间,因为XElement的XPath相关方法都依赖它才能使用。

核心思路

因为每个XElement本身就是<Location>节点(也就是你说的"根"元素),所以我们可以直接针对每个元素用XPath定位它的<Type>子节点,然后判断值是否符合筛选要求。

代码示例

假设你的集合是IEnumerable<XElement> locations,想要筛选所有Type为Airport的Location元素,最简洁的写法是结合LINQ和XPath:

using System.Xml.XPath;

// 筛选Type为Airport的Location元素
var filteredLocations = locations.Where(location => 
    (string)location.XPathSelectElement("Type") == "Airport");

这里用(string)做类型转换是为了避免空引用异常——如果某个Location里没有Type节点,(string)location.XPathSelectElement("Type")会返回null,而如果直接调用.Value属性的话就会抛出异常。

如果你更喜欢用纯XPath的布尔判断逻辑,也可以这么写:

var filteredLocations = locations.Where(location => 
    (bool)location.XPathEvaluate("boolean(Type[text()='Airport'])"));

这个XPath表达式的含义是:判断当前节点下是否存在Type子节点,且它的文本内容恰好是Airport,最终返回布尔值用于筛选。

处理带命名空间的XML

如果你的XML带有自定义命名空间,别忘了创建XmlNamespaceManager来处理命名空间前缀,否则XPath会找不到节点:

var nsManager = new XmlNamespaceManager(new NameTable());
// 替换成你实际的命名空间URI
nsManager.AddNamespace("ns", "http://your-custom-namespace.com");

var filteredLocations = locations.Where(location => 
    (string)location.XPathSelectElement("ns:Type", nsManager) == "Airport");

完成筛选后,你就可以遍历filteredLocations集合来处理符合条件的元素啦!

内容的提问来源于stack exchange,提问作者emery.noel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:18:02