2013-09-26 2 views
0

У меня есть следующие в моем XML:Как получить значения этого xml с помощью linq?

<mur> 
     <bak> 
     </bak> 
     <itemfb ident="c_fb"> 
      <flow_m> 
       <mat> 
       <text texttype="text/plain">correct answer comments</text> 
       </mat> 
      </flow_m> 
     </itemfb> 
     <itemfb ident="gc_fb"> 
      <flow_m> 
       <mat> 
       <text texttype="text/plain">wrong, you made a blunder</text> 
       </mat> 
      </flow_m> 
     </itemfb> 
    </mur> 

Теперь Тег «itemfb», может или не может существовать внутри тега «МУР», и если существует, то мне нужно разобрать и получить значения «правильно ответьте на комментарии »(или)« неправильно, вы сделали ошибку »в зависимости от идентификатора« itemfb ». Вот что я пробовал. Предположим, rowObj имеет загруженный XML от «мур» и «нс» является пространством имен

  if (rowObj.Elements(ns + "itemfb").Any()) 
      { 
       var correctfb = (from cfb in rowObj 
           .Descendants(ns + "itemfb") 
           where (string)cfb.Attribute(ns + "ident").Value == "cfb" 
           select new 
           { 
           ilcfb = (string)cfb.Element(ns + "mat") 
           }).Single(); 

      some_variable_1 = correctfb.ilcfb; 



       var incorrectfb = (from icfb in rowObj 
           .Descendants(ns + "itemfb") 
           where (string)icfb.Attribute(ns + "ident").Value == "gcfb" 
           select new 
           { 
           ilicfb = (string)icfb.Element(ns + "mat") 
           }).Single(); 

      some_variable_2 = incorrectfb.ilicfb; 
      } 

ответ

0

Это должен быть способ, чтобы получить информацию, которую вы хотите. Для простоты я пропустил ns.

var correctfb = rowObj.Descendants("mur") 
    .Descendants("itemfb") 
    .Where(e => e.Attribute("ident").Value == "c_fb") 
    .Descendants("text").FirstOrDefault(); 

if (correctfb != null) 
    some_variable_1 = correctfb.Value; 

var incorrectfb = rowObj.Descendants("mur") 
    .Descendants("itemfb") 
    .Where(e => e.Attribute("ident").Value == "gc_fb") 
    .Descendants("text").FirstOrDefault(); 

if (incorrectfb != null) 
    some_variable_2 = incorrectfb.Value; 
+0

Это может сработать, но что произойдет, если тег не существует. Он выбрасывает исключение «ссылка на объект» в «.Where (e => e.Attribute (ns +« ident »). Значение ==« c_fb »)« – user2085236

+0

Идентификатор может отсутствовать внутри itemfb? –

+1

Если itemfb не существует, он также работает, поэтому я положил FirstOrDefault() в конец. Он может потерпеть неудачу, если идентификатор не существует в itemfb, но это не было в указанных вами ограничениях. Во всяком случае, есть способы решить это. –

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