2 votes

Récupération de la collection ItemGroup et de ses éléments à partir de MSBuild xml

Je veux connaître le nom de l'ItemGroup en analysant le xml ci-dessous en dotnet c#. J'ai essayé plusieurs options mais je n'y suis pas arrivé. En fait, je veux savoir qu'il y a un ItemGroup, il peut y en avoir plus. Y a-t-il un moyen de charger ce xml et d'obtenir la liste des ItemGroups et leurs noms ?

Ici, je veux que le nom de l'ItemGroup soit "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>

J'ai essayé comme suit

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

et puis j'ai commencé à avoir des enfants et tout.

L'exemple de XML ressemble à ceci

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

1voto

George W Bush Points 13450

Utiliser LINQ to XML

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

Votre code LINQ ressemblera à quelque chose comme ceci

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

Références

Mise à jour

Voici un exemple d'application.

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();
        }
    }
}

Il s'agit d'une nouvelle application console C#. Je charge le propre fichier .csproj du projet.

Je ne parviens pas à exécuter ce code avec votre exemple XML. Je soupçonne que c'est parce qu'il brise le schéma défini par l'option http://schemas.microsoft.com/developer/msbuild/2003 .

0voto

Mateo Torres-Ruiz Points 119

Vous pouvez utiliser Microsoft.Build comme ça :

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

Et ensuite, prenez le premier enfant de chaque groupe d'éléments et obtenez son nom :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X