2012-06-30 3 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 cat - animal

Как получить TE.TE из моего .xml?

+0

@jimmy_keen: Хорошее предложение. Я бы использовал 'FirstOrDefault' вместо' First', так как OP затем проверяет 'null_TE == null', что означает, что они ожидают случаев, когда элемент не будет найден. – Douglas

+0

@ Дуглас: Да, это, вероятно, лучший выбор здесь. Удаленный комментарий, поскольку вы уже включили все, что я должен был сказать в вашем ответе. –

+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:] Как получить не только сначала, но 2-й и 3-й? – user1224476

+0

Удалите 'FirstOrDefault' и пропустите последовательность:' foreach (var te в query.Descendants ("TE.TE")) ' – Douglas

Смежные вопросы