2014-04-15 19 views
10

Tôi muốn nhận danh sách tất cả các tham chiếu dự án trong tệp csproj của tôi bằng PowerShell. Hiện nay tôi đã tiếp cận sau:PowerShell XML SelectNodes không xử lý XPath

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

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

Tuy nhiên, kịch bản bất cứ điều gì không ra, mặc dù có chắc chắn là những yếu tố ProjectReference trong file csproj nhất định. Sau đây là làm việc:

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

Nhưng tôi cần XPath sau này cũng + nó ra lỗi đối với từng ItemGroup mà không chứa một ProjectReference - vì vậy làm thế nào để làm cho công việc XPath sử dụng SelectNodes chức năng?

mẫu XML (về cơ bản bất kỳ tập tin csproj VS với sự tham khảo dự án sẽ làm):

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

Bạn có thể thêm một tài liệu XML mẫu cung cấp các hành vi được mô tả? – vonPryz

Trả lời

17

Vấn đề là không gian tên http://schemas.microsoft.com/developer/msbuild/2003. Bạn cần tính đến không gian tên này trong các biểu thức XPath của bạn, vì các tên phần tử không cố định trong XPath tham chiếu đến các phần tử không phải là trong một không gian tên.

[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 
} 

(chuyển thể từ this answer)

Các vấn đề liên quan