作为CI过程的一部分,我正在尝试创建一个buildlabel,它包含xml结构中xml元素的内容。为此我使用nant和xmlpeek。我的问题是我得到一个奇怪的错误说明:
“Nodeindex'0'超出范围”
只有当我xmlpeeking的xml文件在根节点中包含名称空间定义时才会出现这种情况。
从xml文件中删除命名空间可以得到我期望的输出。
生成错误的nant目标可以归结为:
<target name="TDSLabel">
<property name="element" value=""/>
<echo message="Getting element" />
<xmlpeek file="C:\xxx\test1.xml" xpath="//Project/PropertyGroup/ProductVersion" property="element"/>
<echo message="The found element value was: ${element}" />
</target>
,test1.xml文件如下所示:
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProductVersion>9.0.21022</ProductVersion>
</PropertyGroup>
</Project>
答案 0 :(得分:5)
你已经给出了正确的提示。它是关于命名空间的。这应该解决它:
<target name="TDSLabel">
<property name="element" value=""/>
<echo message="Getting element" />
<xmlpeek
file="C:\xxx\test1.xml"
xpath="//x:Project/x:PropertyGroup/x:ProductVersion"
property="element"
verbose="true">
<namespaces>
<namespace prefix="x" uri="http://schemas.microsoft.com/developer/msbuild/2003" />
</namespaces>
</xmlpeek>
<echo message="The found element value was: ${element}" />
</target>
答案 1 :(得分:0)
在这里找到了类似的问题和问题:XmlPoke and unique nodes。问题是我没有在xmlpeek元素中包含命名空间定义,之后在我的xpath语句中省略了对命名空间的必要引用:
<xmlpeek file="C:\xxx\test1.xml" xpath="//x:Project/x:PropertyGroup/x:ProductVersion" property="element">
<namespaces>
<namespace prefix="x" uri="http://schemas.microsoft.com/developer/msbuild/2003" />
</namespaces>
</xmlpeek>