如何使用MSBuild创建XML文件?

| 我想在MSBuild任务中创建XML文件。 我有一个文件列表:
<CreateItem Include=\"$(TestsAssembliesOutputDir)\\Emidee.*.Tests.dll\">
  <Output ItemName=\"TestsAssemblies\" TaskParameter=\"Include\" />
</CreateItem>
我想创建一个看起来像这样的XML:
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<xunit>
  <assemblies>
    <assembly filename=\"PATH OF FILE #1\" shadow-copy=\"true\" />
    <assembly filename=\"PATH OF FILE #2\" shadow-copy=\"true\" />
  </assemblies>
</xunit>
我该如何实现? 提前致谢 麦克风     
已邀请:
又快又脏...
<Target Name=\"CreateXml\">
  <ItemGroup>
    <TestAssembly Include=\"$(TestsAssembliesOutputDir)\\Emidee.*.Tests.dll\" />
    <Line Include=\"line01\"><Text>&lt;xunit&gt;</Text></Line>
    <Line Include=\"line02\"><Text>&lt;assemblies&gt;</Text></Line>
    <Line Include=\"line03\"><Text>&lt;assembly filename=&quot;%(TestAssembly.Identity)&quot; shadow-copy=&quot;true&quot; /&gt;</Text></Line>
    <Line Include=\"line04\"><Text>&lt;/assemblies&gt;</Text></Line>
    <Line Include=\"line05\"><Text>&lt;/xunit&gt;</Text></Line>
    <LineText Include=\"%(Line.Text)\" />
  </ItemGroup>
  <WriteLinesToFile
     File=\"out.xml\"
     Lines=\"@(LineText)\"
     Overwrite=\"true\"
     />
</Target>
留给你练习 初始<? xml行 缩进(在<`Text>内使用CDATA提示) 您还可以在WriteLinesToFile中使用以下内容,并忽略综合的@(LineText)
    Lines=\"@(Line->\'%(Text)\')\"
    
MSBuild Extension Pack具有XmlFile目标。     
一种选择是使用内联任务。这使您可以编写任意C#代码来生成Xml,这可能比替代解决方案更容易(或更难)。这是一个我用来在我的构建中一起破解NuGet nuspec文件的示例。
...
<UsingTask
        TaskName=\"CreateNugetPackage\"
        TaskFactory=\"CodeTaskFactory\"
        AssemblyFile=\"$(MSBuildToolsPath)\\Microsoft.Build.Tasks.v4.0.dll\"
    >
        <ParameterGroup>
            <ProjectName ParameterType=\"System.String\" Required=\"true\" />
            <Version ParameterType=\"System.String\" Required=\"true\" />
            <BaseFolder ParameterType=\"System.String\" Required=\"true\" />

            <Files ParameterType=\"Microsoft.Build.Framework.ITaskItem[]\" Required=\"true\" />
            <OutputFile ParameterType=\"Microsoft.Build.Framework.ITaskItem\" Required=\"true\" />
        </ParameterGroup>

        <Task>
            <Reference Include=\"System.Xml\" />
            <Using Namespace=\"System\" />
            <Using Namespace=\"System.Xml\" />
            <Code Type=\"Fragment\" Language=\"cs\">
                <![CDATA[
                var root = Path.GetFullPath(BaseFolder);    

                using (var w = XmlWriter.Create(OutputFile.ItemSpec)) {
                    var ns = \"http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd\";
                    w.WriteStartElement(\"package\", ns);

                    w.WriteStartElement(\"metadata\");

                    w.WriteStartElement(\"id\");
                    w.WriteValue(ProjectName);
                    w.WriteEndElement();
                    w.WriteStartElement(\"version\");
                    w.WriteValue(Version);
                    w.WriteEndElement();
                    w.WriteStartElement(\"description\");
                    w.WriteValue(\"Test\");
                    w.WriteEndElement();

                    w.WriteStartElement(\"authors\");
                    w.WriteValue(\"Test\");
                    w.WriteEndElement();

                    w.WriteEndElement();


                    w.WriteStartElement(\"files\");

                    foreach(var file in Files) {
                        w.WriteStartElement(\"file\");
                        var inFile = file.ItemSpec;
                        inFile = inFile.Replace(root, \"\");
                        w.WriteAttributeString(\"src\", inFile);
                        w.WriteAttributeString(\"target\", inFile);
                        w.WriteEndElement();
                    }

                    w.WriteEndElement();

                    w.WriteEndElement();
                }

    ]]>
            </Code>
        </Task>
    </UsingTask>


    <Target Name=\"CreateNuspec\" BeforeTargets=\"BuildNugetPackage\">

       <CreateNugetPackage
            Files=\"@(Artifacts)\"
            OutputFile=\"$(NugetPackageSpec)\"
            ProjectName=\"$(ProjectName)\"
            BaseFolder=\"$(ArtifactRoot)\"
            Version=\"$(Version)\"
            />
    </Target>
...
一些相关文档: UsingTaskElement MSBuild内联任务     

要回复问题请先登录注册