C#调用SelectSingleNode查询SVG格式XML节点返回null的问题求解
问题根源
你的XPath无法命中目标节点是三个问题共同导致的:
- 节点层级匹配错误:你提供的SVG中
<sodipodi:namedview>是自闭合标签,没有任何子节点,<g>和<image>节点是和它平级的<svg>根节点直接子节点,不是namedview的后代 - 命名空间使用错误:
<g>、<image>属于SVG默认命名空间(对应你代码里绑定了svg前缀的http://www.w3.org/2000/svg),不属于sodipodi命名空间,不能加sodipodi:前缀,必须加svg:前缀 - 原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
相关产品推荐
相关产品推荐

