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)