Подтвердить что ты не робот

PowerShell XML SelectNodes не обрабатывает XPath

Я хочу получить список всех ссылок на проекты в моем файле csproj с помощью PowerShell. В настоящее время у меня есть следующий подход:

[xml]$csproj = Get-Content MyProject.csproj

$refs = $csproj.SelectNodes("//ProjectReference")
foreach($ref in $refs) {
  # Later on output more useful information
  Write-Host $ref.Name
}

Однако script ничего не выводит, хотя в данном файле csproj есть элементы ProjectReference. Работает:

[xml]$csproj = Get-Content MyProject.csproj
foreach($l in $csproj.Project.ItemGroup.ProjectReference) { Write-Host $l.Include }

Но мне также нужен XPath +, он выводит ошибки для каждой ItemGroup, которая не содержит ProjectReference, - так, как заставить XPath работать с помощью функции SelectNodes?

Пример XML (по существу, любой файл VS csproj с ссылками на проект будет делать):

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup></ItemGroup>
  <ItemGroup>
     <ProjectReference Include="Text"></ProjectReference>
     <ProjectReference Include="Text2"></ProjectReference>
  </ItemGroup>
  <ItemGroup></ItemGroup>
</Project>
4b9b3361

Ответ 1

Проблема - это пространство имен http://schemas.microsoft.com/developer/msbuild/2003. Вы должны учитывать это пространство имен в выражениях XPath, так как имена неповрежденных элементов в XPath относятся к элементам, которые не находятся в пространстве имен.

[xml]$csproj = Get-Content MyProject.csproj
$ns = new-object Xml.XmlNamespaceManager $csproj.NameTable
$ns.AddNamespace("msb", "http://schemas.microsoft.com/developer/msbuild/2003")

$refs = $csproj.SelectNodes("//msb:ProjectReference", $ns)
foreach($ref in $refs) {
  # Later on output more useful information
  Write-Host $ref.Name
}

(адаптирован из этого ответа)