我们使用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应该返回一个值(并且总是有)。我无法在任何地方找到的单个%字符。
我不确定如何以及从何处开始排除此问题...正确方向的任何指针都值得赞赏。
答案 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>
应该工作。
格雷格。