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

时间:2015-06-29 23:35:07

标签: xml powershell default-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访问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)

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

1 个答案:

答案 0 :(得分: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)