MSBuild 4.0在XMLQuery任务(来自MSBuild社区任务包)上失败,错误为MSB4018

时间:2010-07-05 12:36:22

标签: .net msbuildcommunitytasks msbuild-4.0

我们使用MSBuild来运行一个项目,该项目通过社区任务包中的XMLQuery任务从许多其他方面读取XML文件中的某些值。它在MSBuild 3.5下工作正常但在4.0下运行时失败并显示以下消息:

错误MSB4018:“XmlQuery”任务意外失败。  System.Xml.XmlException:名称不能以'%'字符开头,十六进制值0x25。第1行,第2位。  在System.Xml.XmlTextReaderImpl.Throw(例外e)  在System.Xml.XmlTextReaderImpl.Throw(String res,String [] args)  在System.Xml.XmlTextReaderImpl.ParseQName(Boolean isQName,Int32 startOffset,Int32& colonPos)  在System.Xml.XmlTextReaderImpl.ParseElement()  在System.Xml.XmlTextReaderImpl.ParseDocumentContent()  在System.Xml.XmlTextReaderImpl.Read()  在System.Xml.XPath.XPathDocument.LoadFromReader(XmlReader阅读器,XmlSpace空间)  在System.Xml.XPath.XPathDocument..ctor(TextReader textReader)  在MSBuild.Community.Tasks.Xml.XmlQuery.loadXmlContent()  在MSBuild.Community.Tasks.Xml.XmlQuery.Execute()  在Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()  在Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask(ITaskExecutionHost taskExecutionHost,TaskLoggingContext taskLoggingContext,TaskHost taskHost,ItemBucket bucket,TaskExecutionMode howToExecuteTask,Boolean& taskResult)

用于从构建目标中调用XMLQuery的代码:

<!-- Read XML report -->
<ReadLinesFromFile File="coverageXML\symbolmodule.xml">
  <Output TaskParameter="Lines" ItemName="XmlReportLines" />
</ReadLinesFromFile>
<!-- Get number of visited sequence points -->
<XmlQuery Lines="@(XmlReportLines)" XPath="/trendcoveragedata/stats/@vsp">
  <Output TaskParameter="Values" PropertyName="VisitedSequencePoints" />
</XmlQuery>

我无法理解什么是错的。 XML文件完全有效,XMLQuery中指定的XPath应该返回一个值(并且总是有)。我无法在任何地方找到的单个%字符。

我不确定如何以及从何处开始排除此问题...正确方向的任何指针都值得赞赏。

1 个答案:

答案 0 :(得分:6)

ReadLinesFromFile现在(在MSBuild 4.0中)返回转义值。 在运行XmlQUery之前,你必须先取消它们。 像这样:

<!-- Read XML report -->
<ReadLinesFromFile File="coverageXML\symbolmodule.xml">
  <Output TaskParameter="Lines" ItemName="XmlReportLinesEscaped" />
</ReadLinesFromFile>
<ItemGroup>
<XmlReportLinesEscaped>
  <Escaped>%(XmlReportLinesEscaped.Identity)</Escaped>
  <Unescaped>$([MSBuild]::Unescape('%(XmlReportLinesEscaped.Identity)'))</Unescaped>
</XmlReportLinesEscaped>
</ItemGroup>
<ItemGroup>
  <XmlReportLines Include="@(XmlReportLinesEscaped->'%(Unescaped)')"></XmlReportLines >
</ItemGroup>
<!-- Get number of visited sequence points -->
<XmlQuery Lines="@(XmlReportLines)" XPath="/trendcoveragedata/stats/@vsp">
  <Output TaskParameter="Values" PropertyName="VisitedSequencePoints" />
</XmlQuery>

应该工作。

格雷格。