故障排除 SelectSingleNode
具有命名空间的 XML 文档中的 Null 返回
使用包含命名空间的 XML 文档时,使用 SelectSingleNode
查找特定节点可能会意外返回 null
。当目标元素位于未在 XPath 表达式中显式声明的命名空间内时,通常会发生这种情况。
我们举个例子来说明一下:
<code class="language-xml"><?xml version="1.0" encoding="utf-8"?> <project defaulttargets="Build" toolsversion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <itemgroup> <compile include="clsWorker.cs"/> </itemgroup> </project></code>
如果将此 XML 加载到 XmlDocument
(例如 xmldoc
)中,xmldoc.SelectSingleNode("//Compile")
将返回 null
。这是因为 compile
元素位于 xmlns
声明的命名空间内。 删除 xmlns
属性可以解决该问题,但这并不总是一个实用的解决方案。
解决方案:使用XmlNamespaceManager
正确的方法是使用 XmlNamespaceManager
和 SelectSingleNode
。这允许您指定名称空间前缀及其相应的 URI。 方法如下:
<code class="language-csharp">XmlNamespaceManager ns = new XmlNamespaceManager(xmldoc.NameTable); ns.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003"); XmlNode node = xmldoc.SelectSingleNode("//msbld:Compile", ns);</code>
我们创建一个 XmlNamespaceManager
,添加命名空间映射(“msbld”作为指定 URI 的前缀),然后在 SelectSingleNode
调用中使用此管理器。 这可以正确识别并检索 compile
节点。 关键是在 XPath 表达式中使用前缀 msbld:Compile
来显式引用命名空间。
以上是为什么在处理 XML 命名空间时 SelectSingleNode 返回 Null?的详细内容。更多信息请关注PHP中文网其他相关文章!