Каков синтаксис для доступа к дочерним узлам с помощью System.Xml.XmlDocument.SelectNodes с пространством имен?

Учитывая следующий 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)

Но я не могу получить доступ к дочерним узлам. Например, это возвращает нуль:

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

Какой правильный синтаксис для доступа к дочерним узлам?

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)
Другие вопросы по тегам