给出以下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)
访问子节点的正确语法是什么?
答案 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)