2010-05-11 112 views
1

這裏是XML大綱:Quering XElements有子女的兒童屬性

<Root> 
    <Thing att="11">  
    <Child lang="e"> 
     <record></record> 
     <record></record> 
     <record></record> 
    </Child > 
    <Child lang="f"> 
     <record></record> 
     <record></record>     
     <record></record> 
    </Child > 
</Thing> 
</Root> 

我有以下幾點:

TextReader reader = new StreamReader(Assembly.GetExecutingAssembly() 
       .GetManifestResourceStream(FileName)); 

    var data = XElement.Load(reader); 
foreach (XElement single in Data.Elements()) 
{ 
     // english records 
     var EnglishSet = (from e in single.Elements("Child") 
     where e.Attribute("lang").Equals("e") 
     select e.Value).FirstOrDefault(); 
} 

但我發現了倒沒什麼。我希望能夠爲每個「事情」選擇屬性「lang」等於一個值的「孩子」。

我也試過這個,它沒有工作。

var FrenchSet = single.Elements("Child") 
.Where(y => y.Attribute("lang").Equals("f")) 
.Select(x => x.Value).FirstOrDefault(); 

回答

2

你正在檢查的XAttribute對象是否等於字符串"e"
由於XAttribute對象永遠不會等於一個字符串,因此它不起作用。

您需要檢查XAttribute對象的Value,像這樣:

where y => y.Attribute("lang").Value == "e" 
+0

+1比我快2分鐘,但你沒有提到我的第二點(和斯蒂芬也)。 – 2010-05-11 19:58:44

+0

謝謝。我知道這是一件小事。永遠是。 哪種格式最適合使用:基於方法還是基於查詢? – Arnej65 2010-05-11 19:58:51

+1

@ Arnej65基於查詢的編譯器會將其翻譯爲方法,因此使用哪種方法更易於閱讀。 – Stephan 2010-05-11 20:10:48

1

您與字符串「E」比較屬性的對象,而不是attrbute對象的值。你還要返回節點的值而不是節點。由於該值爲空,因此您只需獲取空字符串。

試試這個:

var EnglishSet = (from e in single.Elements("Child") 
        where e.Attribute("lang").Value == "e" 
        select e).FirstOrDefault(); 
1
var EnglishSet = (from e in single.Elements("Child") 
     where e.Attribute("lang").Value.Equals("e") 
     select e).FirstOrDefault(); 

由於Slaks說你檢查的屬性沒有它的價值是 「E」。你也不需要select e.Value,因爲「孩子」節點沒有一個值他們有「記錄」的孩子。

+0

的確如此。我將所有數據都記錄在「記錄」中,而不是節點。 – Arnej65 2010-05-11 20:04:27