Powershell:XPath无法选择元素何时具有" xmlns"标签?

时间:2015-06-24 10:03:03

标签: powershell xpath xml-namespaces default-namespace

我有一个非常简单的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?

非常感谢。

1 个答案:

答案 0 :(得分:4)

您添加的是默认命名空间。与前缀命名空间不同,后代元素继承祖先默认命名空间隐式,除非另有指定(使用指向不同URI的显式前缀或本地默认命名空间)。

要选择命名空间中的元素,您需要定义指向命名空间URI的前缀并在XPath中正确使用该前缀,例如:

$ns = New-Object System.Xml.XmlNamespaceManager($xml.NameTable)
$ns.AddNamespace("d", $xml.DocumentElement.NamespaceURI)
$xml.SelectNodes("//d:Folder", $ns)