1

.csprojファイルの設定を変更するプログラムでは、次のlinq to xmlステートメントは、常に「オブジェクトがオブジェクトのインスタンスに設定されていません」を返します。

static void Main(string[] args)
    {
        string rootDir =
            @"e:\path\to\proj\file\foo.csproj";

        var xDoc = XDocument.Load(rootDir);
        var ns = xDoc.Root.Name.Namespace;

        var hasConditions = xDoc.Root.Elements(ns + "PropertyGroup")
            .Where(x => x.Attribute("Condition") != null);

        Console.WriteLine(hasConditions.Count());

        try
        {
            var debugConfig = xDoc.Root.Elements(ns + "PropertyGroup")
                .Where(x => x.Attribute("Condition")
                .Value == " '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ");

            Console.WriteLine(debugConfig.Count());
        }
        catch
        {
            Console.WriteLine("doesn't work");
        }
    }

完全なプロジェクトファイル:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>8.0.30703</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{F08E2AEB-A1C2-43F9-A93C-38AF2A99C96A}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>CommunicationSystem.XmlLoading.Common</RootNamespace>
    <AssemblyName>CommunicationSystem.XmlLoading.Common</AssemblyName>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <SccProjectName>SAK</SccProjectName>
    <SccLocalPath>SAK</SccLocalPath>
    <SccAuxPath>SAK</SccAuxPath>
    <SccProvider>SAK</SccProvider>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
    <RunCodeAnalysis>true</RunCodeAnalysis>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
    <RunCodeAnalysis>true</RunCodeAnalysis>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'DEV|AnyCPU'">
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>bin\DEV\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <DebugType>full</DebugType>
    <PlatformTarget>AnyCPU</PlatformTarget>
    <ErrorReport>prompt</ErrorReport>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'SIT|AnyCPU'">
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>bin\SIT\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <DebugType>full</DebugType>
    <PlatformTarget>AnyCPU</PlatformTarget>
    <ErrorReport>prompt</ErrorReport>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'QA|AnyCPU'">
    <OutputPath>bin\QA\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <Optimize>true</Optimize>
    <DebugType>pdbonly</DebugType>
    <PlatformTarget>AnyCPU</PlatformTarget>
    <ErrorReport>prompt</ErrorReport>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="StorageSystem">
      <HintPath>..\..\..\GlobalDependencies\StorageSystem\beta\StorageSystem.dll</HintPath>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Configuration" />
    <Reference Include="System.Core" />
    <Reference Include="System.Web" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Common\IEnumerableExtensions.cs" />
    <Compile Include="Common\XmlLoaderBase.cs" />
    <Compile Include="Configuration\SchemasConfigurationElement.cs" />
    <Compile Include="Configuration\SettingsConfigurationElement.cs" />
    <Compile Include="Configuration\TConfigurationElementCollection.cs" />
    <Compile Include="Configuration\XmlLoadingConfigurationSection.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
    <Compile Include="Validation\XValidationResult.cs" />
    <Compile Include="Validation\XValidator.cs" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
   Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
</Project>

私の疑惑は、それが属性値の空白と関係があるということですが、私には確信が持てません....他の誰かが同様の何かに直面していますか?

4

3 に答える 3

2

これが問題だと思います:

x.Attribute(ns + "Condition")

属性が名前空間にあることを確認しますか(要素名とは異なり、属性名は「デフォルト」の名前空間を継承しませんxmlns="..."。)次のことを試してください。

x.Attribute("Condition")

編集:問題が実際に属性がすべての要素に存在しないことである場合、解決策はarcainによって提案されたものよりも簡単です。文字列へのキャストを使用できます。

var debugConfig = xDoc.Root.Elements(ns + "PropertyGroup").Where(x => 
      (string) x.Attribute("Condition") == " [long string here] ");

文字列変換はnull、nullで呼び出されたときに返されます。これは、必要なものです。

(乱雑なフォーマットについてお詫びします-SOの短い行はそれをトリッキーにします。)

于 2012-06-19T16:59:25.180 に答える
1

同様のタスクを実行する必要がありましたが、同じ問題が発生しました。根本的な原因は、Condition属性がすべてのPropertyGroup要素に存在しない可能性があることです。これが私のLINQPadスクリプトからのクエリです(.Dump()メソッドの元になります)。

string projFile = @"FileName";

XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";
XDocument doc = XDocument.Load(projFile);

var query = from node in doc.Root.Descendants(ns + "PropertyGroup")
        where node.Attribute("Condition") != null // this fixed the issue
        && node.Attribute("Condition").Value.IndexOf(
                "'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'",
                StringComparison.OrdinalIgnoreCase) >= 0
        select node;

query.Dump();
于 2012-06-19T17:16:26.500 に答える
0

あなたはすでにあなたの答えを持っています、しかし私はこのxmlライブラリとこの単純なXPathを使ってそれを解決しました:

XElement root = XElement.Load(file);
XElement node = root.XPathElement("//PropertyGroup[@Condition={0}]",
                " '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ");
于 2012-06-19T17:23:39.973 に答える