0

给定以下 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 访问 Task 节点,如下所示:

[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)

但我无法访问子节点。例如,这将返回 null:

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

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

4

1 回答 1

1

您在这里有无前缀的命名空间声明,也称为默认命名空间

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

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

$xml.SelectNodes("ns0:Task/ns0:RegistrationInfo", $ns)
于 2015-06-30T00:27:35.787 回答