Powershell: XPath не может выбрать, когда элемент имеет тег "xmlns"?

У меня есть очень простой XML, как показано ниже:

<?xml version="1.0" encoding="utf-8"?>
<First>
  <Second>
    <Folder>today</Folder>
    <FileCount>10</FileCount>
  </Second>
  <Second>
    <Folder>tomorrow</Folder>
    <FileCount>90</FileCount>
  </Second>
  <Second>
    <Folder>yesterday</Folder>
    <FileCount>22</FileCount>
  </Second>
</First>

Затем у меня есть скрипт powershell для выбора элемента "Папка":

[xml]$xml=Get-Content "D:\m.xml"
$xml.SelectNodes("//Folder")

Это выводит:

#text                                                                                                                                                                            
-----                                                                                                                                                                            
today                                                                                                                                                                            
tomorrow                                                                                                                                                                         
yesterday 

Нет проблем. Но если я изменю xml-файл, добавив "xmlns="http://schemas.microsoft.com/developer/msbuild/2003"на" Первый ", как показано ниже:

<?xml version="1.0" encoding="utf-8"?>
<First xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Second>
    <Folder>today</Folder>
    <FileCount>10</FileCount>
  </Second>
  <Second>
    <Folder>tomorrow</Folder>
    <FileCount>90</FileCount>
  </Second>
  <Second>
    <Folder>yesterday</Folder>
    <FileCount>22</FileCount>
  </Second>
</First>

Тогда мой скрипт powershell ничего не выводит. Зачем? Как изменить мой скрипт powershell для поддержки этого xmlns?

Большое спасибо.

1 ответ

То, что вы добавили, это пространство имен по умолчанию. В отличие от префиксного пространства имен, элементы-потомки неявно наследуют пространство имен по умолчанию предка, если не указано иное (используется явный префикс или локальное пространство имен по умолчанию, которое указывает на другой URI).

Чтобы выбрать элемент в пространстве имен, вам нужно определить префикс, указывающий на URI пространства имен, и правильно использовать этот префикс в вашем XPath, например:

$ns = New-Object System.Xml.XmlNamespaceManager($xml.NameTable)
$ns.AddNamespace("d", $xml.DocumentElement.NamespaceURI)
$xml.SelectNodes("//d:Folder", $ns)
Другие вопросы по тегам