2014-11-06 69 views
3

我想問一些幫助,因爲我完全迷失了。使用Powershell在.csproj文件中的特定節點中的節點列表

我想檢查.csproj文件的特定部分中的節點是否包含正確的數據。在下面的xml代碼片段中,我想回到PropertyGroup屬於「Debug | x64」配置文件的「title」的值。

的csproj文件片段

<?xml version="1.0" encoding="utf-8"?> 
    <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> 
    <PropertyGroup> 
    ... 
    </PropertyGroup> 
    <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'"> 
     <DebugSymbols>true</DebugSymbols> 
     <OutputPath>bin\x64\Debug\</OutputPath> 
     <DefineConstants>DEBUG;TRACE</DefineConstants> 
     <DebugType>full</DebugType> 
     <PlatformTarget>x64</PlatformTarget> 
     <ErrorReport>prompt</ErrorReport> 
     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> 
     <!-- nuget stuff --> 
     <title>Pet Project</title> 
    </PropertyGroup> 

這裏是我的PowerShell代碼:

function GetConfigPlatformNodeFromProjectFile($projectFile, $nodeIdentifier) { 

    [xml] $pFile = Get-Content $projectFile 
    $ns = New-Object System.Xml.XmlNamespaceManager -ArgumentList $pFile.NameTable 
    $ns.AddNamespace("ns", $pFile.Project.GetAttribute("xmlns")) 

    $nodes = $pFile.SelectNodes("//ns:Project/PropertyGroup[contains(@Condition,'Debug|x64')]", $ns) 

    foreach($node in $nodes) { 
     write-Host "node... " $node 
    } 
} 

問題是$節點將始終爲0。據這裏的文章它應該包含更多的東西。路徑是好的。我檢查了很多次。 xmlns屬性可以正確返回。我認爲問題是xpath本身和命名空間,但是我通過其他XPath工具多次檢查過它。

我不知道我在做什麼錯在這種情況下。

感謝任何幫助提前!

András

回答

6

您是否必須使用xpath?否則,我會建議這樣的事情:

$file = [xml](gc .\test.csproj) 

$file.Project.PropertyGroup | ? Condition -Like '*Debug|x64*' | select Title 
+0

這似乎很好!謝謝!另一方面,我不必使用xpath,因爲我是一名測試工程師,所以我有很多經驗。我會試一試,你的答案將被接受。 – SayusiAndo 2014-11-07 12:48:26

+1

我收到一個錯誤:輸入名稱「Condition」無法解析爲屬性。 – 2017-07-06 04:06:51

相關問題