2012-06-30 54 views
2

我.XML數據庫的樣子:無法獲取元素

<root> 
    <Lemma> 
     <Lemma.LemmaSign>cat</Lemma.LemmaSign> 
     <Lemma.PartOfSpeech>(noun)</Lemma.PartOfSpeech> 
     <Lemma.UsageLabel>(kt)</Lemma.UsageLabel> 
     <Sense> 
      <TE> 
       <TE.TE> animal</TE.TE> 
      </TE> 
      <Pronunciation>/ 
       <Pronunciation.Pronunciation>[coot]</Pronunciation.Pronunciation>/ 
      </Pronunciation> 
      : 
      <Example> 
       <Example.Example> it's a cat</Example.Example> 
       <Example.Translation> it's animal</Example.Translation> 
       | 
      </Example> 
     </Sense> 
    </Lemma> 
</root> 

,這就是我的代碼:

var elements = XElement.Load("objects.xml"); 
var query1 = from query in elements.Descendants("Lemma") 
      let null_LemmaSign = query.Element("Lemma.LemmaSign") 
      let null_TE = query.Element("TE.TE") 
      where wyszuk == query.Element("Lemma.LemmaSign").Value 
      select new 
      { 
       word = null_LemmaSign == null ? "none" : null_LemmaSign.Value, 
       te = null_TE == null ? "none" : null_TE.Value, 
      }; 

foreach (var e in query1) 
{ 
MessageBox.Show(e.word.ToString() + " - " + e.te.ToString()); 
} 

而問題是,輸出看起來像: 貓 - 沒有 和應be 貓 - 動物

如何從我的.xml獲取TE.TE?

+0

@jimmy_keen:很好的建議。我會使用'FirstOrDefault'而不是'First',因爲OP會檢查'null_TE == null',這意味着他們期望找不到元素的情況。 – Douglas

+0

@Douglas:是的,這可能是最好的選擇。刪除了評論,因爲您已經在回答中包含了所有我必須說的內容。 –

+0

@Douglas我又已經問題 - 怎樣才能獲得更多的要素: CAT2 CAT3 - 現在我只能得到第1個要素。 – user1224476

回答

3

您的代碼假定<TE.TE><Lemma>的直接子代,但事實並非如此。 <TE.TE><TE>的小孩,它是<Sense>的小孩,它是<Lemma>的孩子。您的代碼應該適合像這樣:

let null_TE = query.Element("Sense").Element("TE").Element("TE.TE") 

爲了簡單起見,你可以作爲jimmy_keen表明,使用Descendants

let null_TE = query.Descendants("TE.TE").FirstOrDefault() 
+0

適合我!萬分感謝! – user1224476

+0

您好再次, 我用它,但我注意到,我得到了TE.TE 的多個元素[ CAT2 CAT3:] 如何獲得不僅第一,但第二和第三? – user1224476

+0

刪除'FirstOrDefault',並遍歷你的序列:'foreach(var te in query.Descendants(「TE.TE」))' – Douglas