使用带有命名空间的 System.Xml.XmlDocument.SelectNodes 访问子节点的语法是什么?

What is the syntax for accessing child nodes using System.Xml.XmlDocument.SelectNodes with a namespace?

给出以下 XML:

<?xml version="1.0" encoding="UTF-8"?>
<Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2014-12-03T13:58:05.5136628</Date>
    <Author>ABCCORP\jsmith</Author>
  </RegistrationInfo>
</Task>

我可以使用 SelectNodes 访问任务节点,如下所示:

[xml]$xml = gc C:\temp\myxml.xml
$ns = new-object Xml.XmlNamespaceManager $xml.NameTable
$ns.AddNamespace("ns0", "http://schemas.microsoft.com/windows/2004/02/mit/task")
$xml.SelectNodes("ns0:Task", $ns)

但是我无法访问子节点。例如,这个 returns null:

$xml.SelectNodes("ns0:Task/RegistrationInfo", $ns)

访问子节点的正确语法是什么?

您有无前缀的命名空间声明,也称为 默认命名空间,此处:

<Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">

请注意,不仅声明默认命名空间的元素在该命名空间中,而且所有后代元素都隐式继承祖先默认命名空间,除非另有说明(使用显式命名空间前缀或指向不同命名空间 uri 的本地默认命名空间)。这意味着,在这种情况下,包括 RegistrationInfo 在内的所有元素都在默认命名空间中,这就是 @PetSerAl 建议对 RegistrationInfo 使用 ns0 前缀的原因:

$xml.SelectNodes("ns0:Task/ns0:RegistrationInfo", $ns)