2012-06-30 105 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