我正在使用MSBuild。
我通过Person_1
获得了$(Person_1)
的价值。如何获得Name
Person_2
子元素的值?我需要语法。
<PropertyGroup>
<Person_1>Bob</Person_1>
<Person_2>
<Name>Bob</Name>
</Person_2>
</PropertyGroup>
答案 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)
。
答案 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
。
您可以使用属性等添加其他元数据。