我有这个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。
答案 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.“选择”条款也是如此。
欢迎任何其他澄清:)