2017-01-23 3 views
0

длина установки всегда равна 0, поэтому код переходит к возврату оператора if, которого не должно быть, и я не могу понять, почему, poperty устанавливается как «TreatWarningsAsErrors» " Мне нужно сравнить значение узла, указанного в строке propertyName.C# array всегда имеет длину 0

public string CheckSettings(XElement propertyGroup, string groupName, string propertyName) 
    { 
     var setting = (from doc in propertyGroup?.Descendants(propertyName) select doc).ToArray(); 

     if (setting.Length == 0) 
     { 
      return groupName + ": " + propertyName + " is missing"; 
     } 

     var allOk = setting.All(n => n.Value.Equals("true", StringComparison.InvariantCultureIgnoreCase)); 
     return allOk ? null : groupName + ": " + propertyName + " has wrong state."; 
    } 

пример XML

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
<DebugSymbols>true</DebugSymbols> 
<DebugType>full</DebugType> 
<Optimize>false</Optimize> 
<OutputPath>..\..\..\..\..\..\Bin\AlfaStandardXmlManifest\</OutputPath> 
<DefineConstants>DEBUG;TRACE</DefineConstants> 
<ErrorReport>prompt</ErrorReport> 
<WarningLevel>4</WarningLevel> 
<UseVSHostingProcess>false</UseVSHostingProcess> 
<DocumentationFile>..\..\..\..\..\..\Bin\AlfaStandardXmlManifest\AlfaStandardXmlManifest.XML</DocumentationFile> 
<CodeAnalysisRuleSet>..\..\..\..\Build\FxCopSoftship_ZeroTolerance.ruleset</CodeAnalysisRuleSet> 
<RunCodeAnalysis>false</RunCodeAnalysis> 
<TreatWarningsAsErrors>false</TreatWarningsAsErrors> 
</PropertyGroup> 

Добавлена ​​XML нагрузки и settigns проверить вызов:

var xmlDoc = XDocument.Load(projectFilePath); 
     XNamespace nameSpace = xmlDoc.Root?.Name.Namespace; 
     if (xmlDoc.Root != null) 
     { 
      var groups = xmlDoc.Root.Descendants(nameSpace + "PropertyGroup").ToArray(); 

      foreach (var group in groups) 
      { 
       result.Add(CheckSettings(group, GroupName(group), "RunCodeAnalysis")); 
       result.Add(CheckSettings(group, GroupName(group), "TreatWarningsAsErrors")); 

Вот что отладчик дал мне для группы

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' " xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <DebugSymbols>true</DebugSymbols> 
    <DebugType>full</DebugType> 
    <Optimize>false</Optimize> 
    <OutputPath>..\..\..\..\..\..\Bin\AlfaStandardXmlManifest\</OutputPath> 
    <DefineConstants>DEBUG;TRACE</DefineConstants> 
    <ErrorReport>prompt</ErrorReport> 
    <WarningLevel>4</WarningLevel> 
    <UseVSHostingProcess>false</UseVSHostingProcess> 
    <DocumentationFile>..\..\..\..\..\..\Bin\AlfaStandardXmlManifest\AlfaStandardXmlManifest.XML</DocumentationFile> 
    <CodeAnalysisRuleSet>..\..\..\..\Build\FxCopSoftship_ZeroTolerance.ruleset</CodeAnalysisRuleSet> 
    <RunCodeAnalysis>false</RunCodeAnalysis> 
    <TreatWarningsAsErrors>false</TreatWarningsAsErrors> 
</PropertyGroup> 
+2

'ToArray()' никогда не может вернуть значение null. в чем именно проблема?: – SLaks

+0

@SLaks код всегда, кажется, перепрыгивает в return внутри оператора if, который не должен – Pagodatree

+3

Это не то же самое, что он возвращает null, не так ли? Это означает, что результатов нет, что немного отличается. Я предполагаю, что ваш запрос неверен, имя, вероятно, имеет пространство имен, отличное от значения по умолчанию. Вам нужно предоставить [mcve]. –

ответ

0

Хорошо, проблема, как SLaks сказал это с пространством имен. В ваших CheckSettings внутри Descendants вам не хватает пространства имен:

XNamespace nameSpace = propertyGroup.Name.Namespace; 
var setting = (from doc in propertyGroup?.Descendants(nameSpace + propertyName) select doc).ToArray(); 
+0

, и это, наконец, благодарит вас – Pagodatree

2

Большинство MSBuild файлы проекта имеют имя XML space (xmlns="..." в корневом элементе), который применяется ко всем именам в XML.

Вы должны включить это пространство имен в вашем имени элемента:

XNamespace ns = "..."; 
XName name = ns + "..."; 
Смежные вопросы