Powershell:[xml].SelectNodes 没有 return 预期结果?
Powershell: [xml].SelectNodes doesn't return expected results?
我正在使用 powershell 解析 C# 项目文件,这是一个标准的 xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<ProjectType>Local</ProjectType>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<CodeAnalysisRules>-Microsoft.Design#CA2210;Microsoft</CodeAnalysisRules>
<PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup>
</Project>
我希望使用 "SelectNodes" 函数 select 输出 "CodeAnalysisRules" 标签内容:
function f($fileName)
{
Write-Host "Parsing $fileName"
[xml]$xml=Get-Content $fileName
if([String]::IsNullOrEmpty($xml.Project.NamespaceURI))
{
write-Host "skip!" -ForegroundColor Yellow
}
else
{
[System.Xml.XmlNamespaceManager]$ns = $xml.NameTable
$ns.AddNamespace("Any", $xml.DocumentElement.NamespaceURI)
$ns
$nodes = $xml.SelectNodes("//CodeAnalysisRules",$ns)
$nodes.Count
}
}
f d:\m.xml
我希望得到里面的字符串,但实际上我得到了:
Parsing d:\m.xml
xmlns
xml
Any
0
我的程序或假设有什么问题吗?
谢谢!
您的 XML 在文档元素级别声明了 默认名称空间。请注意,后代元素继承祖先默认命名空间 隐式 ,除非另有说明。这意味着,您定位到 select 的 CodeAnalysisRules
元素位于默认命名空间中,这就是为什么您需要使用注册前缀 Any
到 select 元素,如@PetSerAl 在评论中:
$nodes = $xml.SelectNodes("//Any:CodeAnalysisRules",$ns)
我正在使用 powershell 解析 C# 项目文件,这是一个标准的 xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<ProjectType>Local</ProjectType>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<CodeAnalysisRules>-Microsoft.Design#CA2210;Microsoft</CodeAnalysisRules>
<PlatformTarget>AnyCPU</PlatformTarget>
</PropertyGroup>
</Project>
我希望使用 "SelectNodes" 函数 select 输出 "CodeAnalysisRules" 标签内容:
function f($fileName)
{
Write-Host "Parsing $fileName"
[xml]$xml=Get-Content $fileName
if([String]::IsNullOrEmpty($xml.Project.NamespaceURI))
{
write-Host "skip!" -ForegroundColor Yellow
}
else
{
[System.Xml.XmlNamespaceManager]$ns = $xml.NameTable
$ns.AddNamespace("Any", $xml.DocumentElement.NamespaceURI)
$ns
$nodes = $xml.SelectNodes("//CodeAnalysisRules",$ns)
$nodes.Count
}
}
f d:\m.xml
我希望得到里面的字符串,但实际上我得到了:
Parsing d:\m.xml
xmlns
xml
Any
0
我的程序或假设有什么问题吗? 谢谢!
您的 XML 在文档元素级别声明了 默认名称空间。请注意,后代元素继承祖先默认命名空间 隐式 ,除非另有说明。这意味着,您定位到 select 的 CodeAnalysisRules
元素位于默认命名空间中,这就是为什么您需要使用注册前缀 Any
到 select 元素,如@PetSerAl 在评论中:
$nodes = $xml.SelectNodes("//Any:CodeAnalysisRules",$ns)