3

我有一个非常简单的 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" 添加到“First”,如下所示:

<?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?

非常感谢。

4

1 回答 1

4

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

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

$ns = New-Object System.Xml.XmlNamespaceManager($xml.NameTable)
$ns.AddNamespace("d", $xml.DocumentElement.NamespaceURI)
$xml.SelectNodes("//d:Folder", $ns)
于 2015-06-24T10:19:58.100 回答