当有多个匹配时,C#XPathSelectElement()

时间:2015-11-24 15:31:41

标签: c# xml xpath

我们在我支持的应用程序中获得意外结果,因为代码在匹配多个项目的路径上调用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()方法。

然而,我想确定我了解它目前(错误地)做了什么。在这种情况下,我还没有找到任何关于预期行为的文档。或者这只是一种非标准的行为,你不能期望在环境/版本/等之间表现一致吗?

2 个答案:

答案 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);
相关问题