我们在我支持的应用程序中获得意外结果,因为代码在匹配多个项目的路径上调用XPathSelectElement()。举例说明:
XElement e = XElement.Parse(@"<root>
<child ID="123">A</child>
<child ID="234">B</child>
</root>");
Console.Out.WriteLine(e.XPathSelectElement("//child").Value);
在这个简单的例子中,它正在返回&#34; A&#34;。在我们更复杂的生产代码中,它似乎正在返回最后一场比赛。
要明确的是,我将在XPath中使用额外的过滤修复此错误,以使查询结果唯一。我不想依赖于滥用XPathSelectElement()方法。
然而,我想确定我了解它目前(错误地)做了什么。在这种情况下,我还没有找到任何关于预期行为的文档。或者这只是一种非标准的行为,你不能期望在环境/版本/等之间表现一致吗?
答案 0 :(得分:2)
XPathSelectElements
的文档说(https://msdn.microsoft.com/en-us/library/bb342176%28v=vs.110%29.aspx)&#34;虽然XML XPath语言1.0建议书中未指定返回集合的顺序,但此扩展方法按文档顺序返回节点。 #34 ;. XPathSelectElement(http://referencesource.microsoft.com/#System.Xml.Linq/System/Xml/Linq/XNodeNavigator.cs,7b67622e3ab8770e)的实现只是return node.XPathSelectElements(expression, resolver).FirstOrDefault();
。因此,基于此,您应该按文档顺序获取第一个选定的child
元素的值。如果你得到不同的结果,我会认为这是一个错误,但我们需要一个最小但完整的XML和.NET样本,以便我们重现结果。
答案 1 :(得分:1)
正确的灵魂在你的选择中更具体。如果您总是想要第一个元素,可以使用XPathSelectElements和First():
XElement e = XElement.Parse(@"<root>
<child ID=""123"">A</child>
<child ID=""234"">B</child>
</root>");
Console.Out.WriteLine(e.XPathSelectElements("//child").First().Value);
或者您可以使用更具体的xpath获取第一个元素:
XElement e = XElement.Parse(@"<root>
<child ID=""123"">A</child>
<child ID=""234"">B</child>
</root>");
Console.Out.WriteLine(e.XPathSelectElement("(//child)[1]").Value);