我有一个非常简单的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脚本来选择&#34; Folder&#34;元素:
[xml]$xml=Get-Content "D:\m.xml"
$xml.SelectNodes("//Folder")
输出:
#text
-----
today
tomorrow
yesterday
没问题。但是,如果我更改xml文件以添加&#34; xmlns =&#34; http://schemas.microsoft.com/developer/msbuild/2003"到&#34;第一&#34;如下所示:
<?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?
非常感谢。
答案 0 :(得分:4)
您添加的是默认命名空间。与前缀命名空间不同,后代元素继承祖先默认命名空间隐式,除非另有指定(使用指向不同URI的显式前缀或本地默认命名空间)。
要选择命名空间中的元素,您需要定义指向命名空间URI的前缀并在XPath中正确使用该前缀,例如:
$ns = New-Object System.Xml.XmlNamespaceManager($xml.NameTable)
$ns.AddNamespace("d", $xml.DocumentElement.NamespaceURI)
$xml.SelectNodes("//d:Folder", $ns)