首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用MSBuild创建XML文件?

如何用MSBuild创建XML文件?
EN

Stack Overflow用户
提问于 2011-04-14 23:46:53
回答 3查看 10.9K关注 0票数 19

我想在MSBuild任务中创建一个XML文件。

我有一个文件列表:

代码语言:javascript
复制
<CreateItem Include="$(TestsAssembliesOutputDir)\Emidee.*.Tests.dll">
  <Output ItemName="TestsAssemblies" TaskParameter="Include" />
</CreateItem>

我想创建一个XML,如下所示:

代码语言:javascript
复制
<?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>

我怎样才能做到这一点呢?

提前感谢

麦克

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-15 02:20:57

又快又脏...

代码语言:javascript
复制
<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 line
  • Indentation (提示在<`Text>中使用CDATA )

您还可以在WriteLinesToFile中使用以下代码,并省略合成的@(LineText)

代码语言:javascript
复制
    Lines="@(Line->'%(Text)')"
票数 30
EN

Stack Overflow用户

发布于 2011-04-15 04:05:37

MSBuild Extension PackXmlFile target

票数 0
EN

Stack Overflow用户

发布于 2016-05-19 00:34:26

一种选择是使用内联任务。这允许您编写任意的C#代码来生成Xml,这可能比替代解决方案更容易(也可能更难)。这是一个例子,我用它在我的构建中把一个NuGet nuspec文件拼凑在一起。

代码语言:javascript
复制
...
<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 inline tasks

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5665900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档