仅当元素是第一个时,查询才返回结果

时间:2012-10-04 15:27:10

标签: c# linq-to-xml

我有这个XML文件:

<MyFile>
    <PossibleResponses>
        <Response text="response1"/>
        <Response text="response2"/>
    </PossibleResponses>
</MyFile>

我正在尝试检索其中一个回复:

var selectedResponse = (from i in XElement.Load("MyFile.xml").Elements("PossibleResponses")
where i.Element("Response").Attribute("text").Value == parameter
select i.Element("Response")).Single();

现在,如果我想要获得第一个响应(参数= response1),那么它可以工作。 如果我试图获得第二个响应(参数=响应2),则它不返回任何结果。

如果我在XML文件中切换顺序,则返回response2,但不返回响应1。

3 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为在您的select子句中,您再次调用i.Element("Response"),根据文档,它返回文档顺序中的第一个元素(即response1)。

答案 1 :(得分:0)

将查询更改为:

var selectedResponse = (from p in XDocument.Load("MyFile.xml") where p.Descendents("MyFile").Descendents("PossibleResponses").Descendents("Response").Any(k=>k.Attribute("text").Value == parameter) select p).Single();

我直接在这里写了,所以可能有语法错误。我们的想法是使用“后代”方法,它为您提供具有指定名称的所有元素,具有您希望的特定值的过滤元素并选择它。

答案 2 :(得分:0)

我得到了response 的帮助,但做了一些修改:

var result = from i in XElement.Load("MyFile.xml").Descendants("Response")
    where i.Attribute("text").Value == "response2"
    select i;

根据我对Linq的有限理解,我认为这里的关键是 'XElement.Load(“MyFile.xml”)。后代(“响应”)' 返回元素列表,以便:
1.“Where”子句应直接引用元素级别,不需要“重新提及”它的元素 2.“选择”条款也是如此。

欢迎任何其他澄清:)