2010-07-05 70 views
2

我們使用MSBuild運行一個項目,該項目通過社區任務中的XMLQuery任務從XML文件中讀取一些值包。它在MSBuild 3.5下運行良好,但在4.0下運行時失敗,並顯示以下消息:MSBuild 4.0在XMLQuery任務(來自MSBuild社區任務包)上失敗,出現錯誤MSB4018

錯誤MSB4018:「XmlQuery」任務意外失敗。 System.Xml.XmlException:名稱不能以'%'字符開頭,十六進制值爲0x25。在System.Xml.XmlTextReaderImpl.ParseQName(布爾isQName行1,位置2在 System.Xml.XmlTextReaderImpl.Throw(例外五) 在System.Xml.XmlTextReaderImpl.Throw(字符串RES,字串[] args) , INT32開始偏移,INT32 & colonPos) 在System.Xml.XmlTextReaderImpl.ParseElement() 在System.Xml.XmlTextReaderImpl.ParseDocumentContent() 在System.Xml.XmlTextReaderImpl.Read() 在System.Xml.XPath.XPathDocument。在MSBuild.Community.Tasks.Xml.XmlQuery上的MSBuild.Community.Tasks.Xml.XmlQuery.loadXmlContent() System.Xml.XPath.XPathDocument.ctor(TextReader textReader) 上的LoadFromReader(XmlReader reader,XmlSpace space) .Execute() 在Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() 在Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask(ITaskExecutionHost taskExecutionHost,TaskLoggingContext taskLoggingContext,TaskHost taskHost,ItemBucket桶,TaskExecutionMode howToExecuteTask,布爾& 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應該返回一個值(並且始終有)。我無法在任何地方找到一個%字符

我不知道如何以及從哪裏開始解決這個問題......任何正確的方向指針讚賞。

+2

我注意到有可能使用Visual Studio 2010實際調試MSBuild項目,所以我會嘗試查看是否給出了更多信息 – Mels 2010-07-28 12:56:27

回答

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> 

應該工作。

Greg。