Linq to XML获取根节点所有后代遇编译错误,求SVG形状节点枚举方法
Linq to XML 获取根节点所有后代节点及SVG形状节点枚举方案
编译错误原因
你写的代码出现"A query body must end with a select clause or group clause"错误,核心问题有两个:
SelectMany()调用无参数,且此处完全不需要该方法——xml.Root.Descendants()本身就会返回根节点下所有层级的后代节点集合。- 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
相关产品推荐
相关产品推荐

