MSBuild的嵌套属性的语法是什么?

时间:2015-09-21 16:42:20

标签: visual-studio msbuild

我正在使用MSBuild。

我通过Person_1获得了$(Person_1)的价值。如何获得Name Person_2子元素的值?我需要语法。

<PropertyGroup>
  <Person_1>Bob</Person_1>
  <Person_2>
    <Name>Bob</Name>
  </Person_2>
</PropertyGroup>

3 个答案:

答案 0 :(得分:3)

RE:https://msdn.microsoft.com/en-us/library/ms171458.aspx 包含XML的属性就是这样。您不能仅仅因为它是XML而访问部分内容。要理解这一点,请执行以下操作;

<PropertyGroup> 
   <MyProperty>
       <PropertyContentXML>
           <InnerXML1>Blablabla</InnerXML1>
           <InnerXML2>More blablabla</InnerXML2>
       </PropertyContentXML>
   </MyProperty>
</PropertyGroup> 
<Target Name="Build">
    <Message Text="$(MyProperty)" />
</Target>

输出结果如下:

<PropertyContentXML xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <InnerXML1>Blablabla</InnerXML1>
        <InnerXML2>More blablabla</InnerXML2>
</PropertyContentXML>

答案 1 :(得分:0)

您正在混合Properties和ItemGroups。

属性是简单的命名值,ItemGroups是具有标识和属性的项目。你不能以同样的方式使用它们。

属性定义为:

<PropertyGroup>
    <name>value</name>
</Propertygroup>

并使用$(name)语法进行访问。

项目组定义为:

<ItemGroup>
    <Item Include="item1">
        <ItemPropery>value</ItemProperty>
    </Item>
</ItemGroup>

并使用以下语法进行访问:%(Item.ItemProperty)

另见this reference for the 'intuitive' syntax

答案 2 :(得分:0)

你需要一些先进的东西,比如内联任务:

<UsingTask TaskName="TransformXmlToItem" 
           TaskFactory="CodeTaskFactory"
           AssemblyName="Microsoft.Build.Tasks.Core">
  <ParameterGroup>
    <Xml Required="true"/>
    <Elements ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true"/>
  </ParameterGroup>
  <Task>
    <Reference Include="System.Xml" />
    <Using Namespace="System.Collections.Generic" />
    <Using Namespace="System.Xml" />
    <Code Type="Fragment" Language="cs">
      <![CDATA[  
        using (var xr = new XmlTextReader(Xml, XmlNodeType.Element,
            new XmlParserContext(null, null, null, XmlSpace.Default))) {

            xr.Namespaces = false;
            xr.MoveToContent();
            var items = new List<ITaskItem>();
            while (!xr.EOF) {
                if (xr.NodeType == XmlNodeType.Element) {
                    var item = new TaskItem(xr.Name);
                    var text = xr.ReadElementContentAsString();
                    if (!string.IsNullOrWhiteSpace(text)) {
                        item.SetMetadata("text", text);
                    }
                }
                xr.Read();
            }
            Elements = items.ToArray();
        }
    ]]>
  </Code>
</Task>

该任务读取XML元素并从中创建项目。文本转换为元数据。

然后您可以编写如下任务:

<Target Name="DeconstructPropertyXml">
  <TransformXmlToItem Xml="$(Person_2)">
    <Output TaskParameter="Elements" ItemName="Person_2I"/>
  </TransformXmlToItem>
  <Message Text="%(Person_2I.Identity) = %(Person_2I.text)" Importance="high"/>
</Target>

哪个应该输出Name = Bob

您可以使用属性等添加其他元数据。