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

Linq to XML获取根节点所有后代遇编译错误,求SVG形状节点枚举方法

Linq to XML 获取根节点所有后代节点及SVG形状节点枚举方案

编译错误原因

你写的代码出现"A query body must end with a select clause or group clause"错误,核心问题有两个:

  1. SelectMany()调用无参数,且此处完全不需要该方法——xml.Root.Descendants()本身就会返回根节点下所有层级的后代节点集合。
  2. LINQ查询语法(from...in...结构)必须以select或group子句收尾,你的代码缺少这部分。

正确实现方式

1. 获取根节点所有后代节点

直接调用Descendants()即可,无需额外处理:

var xml = XDocument.Load(@"C:\diagram.svg");
// 获取根节点下所有后代节点
var allDescendants = xml.Root.Descendants();

2. 枚举SVG中的形状节点(rect、ellipse、path等)

SVG文件通常带有默认命名空间(http://www.w3.org/2000/svg),直接匹配节点名称会失败,需处理命名空间后筛选:

方式一:使用LINQ查询语法

var xml = XDocument.Load(@"C:\diagram.svg");
// 声明SVG命名空间
XNamespace svgNs = "http://www.w3.org/2000/svg";
// 筛选指定形状节点
var shapeNodes = from node in xml.Root.Descendants()
                 where node.Name == svgNs + "rect" 
                    || node.Name == svgNs + "ellipse" 
                    || node.Name == svgNs + "path"
                 select node;

方式二:使用方法链写法(更简洁)

var xml = XDocument.Load(@"C:\diagram.svg");
// 直接通过本地名称筛选,无需显式声明命名空间
var shapeNodes = xml.Root.Descendants()
                     .Where(n => 
                         n.Name.LocalName == "rect" || 
                         n.Name.LocalName == "ellipse" || 
                         n.Name.LocalName == "path");

内容的提问来源于stack exchange,提问作者NickG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:55:19