2012-10-04 100 views
0

我有這個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)然後它的工作。 如果我想獲得第二個響應(參數= response2),那麼它不會返回任何結果。

如果我切換XML文件中的順序,則返回response2,但是,響應1不是。

回答

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中’) .Decendants(「Response」)'返回如下元素列表:
1.'Where'子句應直接指向元素級別,不需要'重新提及'其元素。
2.「Select」子句相同。

歡迎任何其他澄清:)

0

發生這種情況的原因是,在select子句中,您再次調用i.Element("Response"),根據文檔返回文檔順序中的第一個元素(即response1)。

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(); 

我這裏直接寫的,所以也許有一個語法錯誤。我們的想法是使用「後代」方法,它爲您提供指定名稱的所有元素,過濾元素和您希望的特定值並選擇它。