使用带有命名空间的 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)
给出以下 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)