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

C#调用SelectSingleNode查询SVG格式XML节点返回null的问题求解

问题根源

你的XPath无法命中目标节点是三个问题共同导致的:

  1. 节点层级匹配错误:你提供的SVG中<sodipodi:namedview>是自闭合标签,没有任何子节点,<g>和<image>节点是和它平级的<svg>根节点直接子节点,不是namedview的后代
  2. 命名空间使用错误:<g>、<image>属于SVG默认命名空间(对应你代码里绑定了svg前缀的http://www.w3.org/2000/svg),不属于sodipodi命名空间,不能加sodipodi:前缀,必须加svg:前缀
  3. 原XPath存在语法错误:你写的第一个XPath末尾多了多余的]符号,会直接导致语法校验失败

正确代码

如果需要直接定位到<image>节点,修改你的XPath即可:

XmlDocument document = new XmlDocument();
document.Load(openFileDialog.FileName);
XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(document.NameTable);
xmlnsManager.AddNamespace("inkscape", "http://www.inkscape.org/namespaces/inkscape");
xmlnsManager.AddNamespace("sodipodi", "http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd");
xmlnsManager.AddNamespace("xlink", "http://www.w3.org/1999/xlink");
xmlnsManager.AddNamespace("svg", "http://www.w3.org/2000/svg");

// 方式1:按已知层级直接定位
XmlNode imageNode = document.DocumentElement.SelectSingleNode("svg:g/svg:image", xmlnsManager);

// 方式2:不限制层级,直接查找文档内所有<image>节点(适用性更强)
// XmlNode imageNode = document.DocumentElement.SelectSingleNode("//svg:image", xmlnsManager);

如果需要先拿到<g>节点再操作,把XPath改成"svg:g"即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:09:04