【问题标题】:Getting ItemGroup collection and their Items from MSBuild xml从 MSBuild xml 获取 ItemGroup 集合及其项目
【发布时间】:2018-11-09 00:35:32
【问题描述】:

我想通过在 dotnet c# 中解析下面的 xml 来知道 ItemGroup 的名称。我尝试了各种选择,但无法得到它。基本上我想知道有 ItemGroup ,它可以更多。无论如何我们可以加载这个 xml 并获取 ItemGroups 的列表及其名称。

这里我希望 ItemGroup 名称为“cssfile_individual”,cssfile_individual2

    <Project xmlns="http://schemas.microsoft.com/developer/MsBuild/2003">

      <UsingTask TaskName="CssCompressorTask" AssemblyFile="Yahoo.Yui.Compressor.Build.MsBuild.dll" />
      <UsingTask TaskName="JavaScriptCompressorTask" AssemblyFile="Yahoo.Yui.Compressor.Build.MsBuild.dll" />

      <PropertyGroup>

      </PropertyGroup>

        <Target Name="Minify">

        <ItemGroup>
          <cssfile_individual Include="test1.css"/>
          <cssfile_individual Include="test2.css"/>
          <cssfile_individual Include="test3.css"/>
          <cssfile_individual Include="test3.css"/>      
        </ItemGroup>

 <ItemGroup>
      <cssfile_individual2 Include="test1.css"/>
      <cssfile_individual2 Include="test2.css"/>
      <cssfile_individual2 Include="test3.css"/>
      <cssfile_individual2 Include="test3.css"/>      
    </ItemGroup>

        </Target>
    </Project>

我尝试如下

 XmlDocument objXML = new XmlDocument();
             objXML.Load(path);

然后开始生孩子。

示例 XML 如下所示

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/MsBuild/2003">
  <UsingTask TaskName="CompressorTask"
             AssemblyFile="D:\JsCssCompressor\JsCssCompressor\bin\Yahoo.Yui.Compressor.Build.MsBuild.dll" />

  <Target Name="MyTaskTarget">
    <ItemGroup>
      <JavaScriptFiles Include="C:\Work\Purchase_Flow\eBizSol_App\Release\WebSites\Websites\McAfee.Consumer.Website\UIDesign\LegacySite\Scripts\FlexDashboard\AddDevice.js"/>
    </ItemGroup>
    <CompressorTask
        JavaScriptCompressionType="YuiStockCompression"
        JavaScriptFiles="@(JavaScriptFiles)"
        ObfuscateJavaScript="True"
        PreserveAllSemicolons="False"
        DisableOptimizations="Nope"
        EncodingType="Default"
        DeleteJavaScriptFiles="false"
        LineBreakPosition="-1"
        JavaScriptOutputFile="C:\Work\Purchase_Flow\eBizSol_App\Release\WebSites\Websites\McAfee.Consumer.Website\UIDesign\LegacySite\Scripts\FlexDashboard\MAA2.0.js"
        LoggingType="ALittleBit"
        ThreadCulture="en-us"
        IsEvalIgnored="false"
            />
  </Target>
</Project>

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    使用 LINQ to XML

    XDocument objXML = new XDocument();
    objXML.Load(path);
    

    您的 LINQ 代码将如下所示

    var ItemGroups = from IG in objXML.Descendants("ItemGroup")
                     select new {
                         Children = LG.Descendants()
                     };
    
    //Print Results
    string str = "";
    
    foreach (var IG in ItemGroups){
      str += "Item Group Name: " + IG.Children[0].Name + Environment.NewLine;
      foreach (var IGValue in IG.Children){
        str += "  " + IGValue.Attribute("Include").Value + Environment.NewLine;
      }
    }
    

    参考文献

    更新

    这是一个示例应用程序。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Xml.Linq;
    
    namespace testapp_xdocument_linq
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";
                XDocument X = XDocument.Load("C:\\Users\\Brian\\Documents\\Visual Studio 2012\\Projects\\testapp_xdocument_linq\\testapp_xdocument_linq\\testapp_xdocument_linq.csproj");
                
                var PropertyGroups = from PG in X.Descendants(ns + "PropertyGroup") select PG;
    
                //Print Results
                foreach (var element in PropertyGroups)
                {
                    Console.WriteLine("First Descendant Name: " + element.Descendants().First().Name + Environment.NewLine);
                }
    
                Console.ReadLine();
            }
        }
    }
    

    这是一个全新的 C# 控制台应用程序。我正在加载项目自己的 .csproj 文件。

    我无法针对您的示例 XML 执行此代码。我怀疑这是因为它破坏了http://schemas.microsoft.com/developer/msbuild/2003 定义的架构。

    【讨论】:

    • 不知何故我没有得到 ItemGroups
    • XMLDocument 没有称为后代的方法,所以我将其更改为 XDocument ,
    • @kobe,哎呀,抱歉这个错误。我将答案改为 XDocument
    • 不知何故我无法使用 ItemGroups,您可以在本地尝试吗,我将为您提供示例 XMl
    • 当我使用您的查询时,我没有得到 ItemGroups
    【解决方案2】:

    你可以像这样使用Microsoft.Build

    var pathToXml = @"<path>";
    var nodes = ProjectRootElement.Open(pathToXml).AllChildren;
    var itemGroupElements = nodes.OfType<ProjectItemGroupElement>();
    

    然后获取每个 Item Group 的第一个子项并获取其名称:

    foreach (var itemGroup in itemGroupElements)
    {
        Console.WriteLine(itemGroup.FirstChild.ElementName);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 2010-11-08
      相关资源
      最近更新 更多