2010-11-09 2 views
0

У меня есть последующие XML-файл:Запрос в LINQ to XML?

<Questionario> 
    <Relacoes Marca="SADIA"> 
     <Questao> 
     <IDEtapa> 
     1 
     </IDEtapa> 
     <IDQuestao> 
     1 
     </IDQuestao> 
     <Tipo ID="1"> 
      <V1></V1> 
      <V2></V2> 
      <V3></V3> 
      <V4></V4> 
     </Tipo> 
     </Questao> 
     <Questao> 
      <IDEtapa> 
       1 
      </IDEtapa> 
      <IDQuestao> 
       2 
      </IDQuestao> 
      <Tipo ID="1"> 
       <V1>Ruim</V1> 
       <V2>Regular</V2> 
       <V3>Bom</V3> 
       <V4>Ótimo</V4> 
      </Tipo> 
     </Questao> 
    </Relacoes> 
</Questionario> 

Я пытаюсь получить его значение с помощью запроса последующего:

XDocument questionarioXML = XDocument.Load(HttpContext.Current.Server.MapPath("~/xmlRelacaoesQuestionario.xml")); 
    var questao = from q in questionarioXML.Descendants("Questionario").Descendants("Relacoes") where q.Attribute("Marca").Value == "SADIA" 
        select new { 
         Tipo = q.Element("Tipo").Attribute("ID").Value, 
         V1 = q.Element("V1").Value, 
         V2 = q.Element("V2").Value, 
         V3 = q.Element("V3").Value, 
         V4 = q.Element("V4").Value 
        }; 

Но вар questionario всегда NULL?

Любые идеи?

+0

Какая переменная равна нулю? У вас нет * переменной * questionaria. Вы уверены, что работает вызов XDocument.Load? Если это не работает, сам запрос не имеет значения. –

+0

questao is null, извините – ozsenegal

ответ

1

Похоже, вы хотите

var questao = from q in questionarioXML.Descendants("Questionario").Descendants("Relacoes") 
       where q.Attribute("Marca").Value == "SADIA" 
       select new 
       { 
        Tipo = q.Element("Questao").Element("Tipo").Attribute("ID").Value, 
        V1 = q.Element("Questao").Element("Tipo").Element("V1").Value, 
        V2 = q.Element("Questao").Element("Tipo").Element("V2").Value, 
        V3 = q.Element("Questao").Element("Tipo").Element("V3").Value, 
        V4 = q.Element("Questao").Element("Tipo").Element("V4").Value 
       }; 

который я думаю, может быть более читаемым и более эффективным использованием

var questao = (from q in questionarioXML.Descendants("Questionario").Descendants("Relacoes") 
       where q.Attribute("Marca").Value == "SADIA" 
       select q) 
    .Select(q => q.Element("Questao").Element("Tipo")) 
    .Select(t => new 
         { 
          Tipo = t.Attribute("ID").Value, 
          V1 = t.Element("V1").Value, 
          V2 = t.Element("V2").Value, 
          V3 = t.Element("V3").Value, 
          V4 = t.Element("V4").Value 
         }); 

XElement.Element получает первый элемент уровня, ваш Tipo элемент был на втором уровне, внутри Questao.

+0

Хорошая работа! Thk ... – ozsenegal

+0

Мне нужна помощь, этот запрос возвращает только один тег Questao, мне нужно получить все из них !!! пожалуйста !!! – ozsenegal

+0

@ user257234: Вы попробовали мой ответ? Думаю, он уже делает то, что вы хотите. –

1

Я подозреваю, что questao не является нулевым. Я подозреваю, что при попытке выполнить запрос вы бросаете NullReferenceException.

Это потому, что вы пытаетесь добраться до элемента <Tipo>, но вы выбрали только элемент Relacoes. Затем вы пытаетесь получить V1-V4 из «текущего» элемента, а не из Tipo.

Я подозреваю, что вы хотите:

var questao = 
    from q in questionarioXML.Descendants("Questionario") 
          .Descendants("Relacoes") 
    where q.Attribute("Marca").Value == "SADIA" 
    from tipo in q.Elements("Questao").Elements("Tipo") 
    select new { 
     Tipo = tipo.Attribute("ID").Value, 
     V1 = tipo.Element("V1").Value, 
     V2 = tipo.Element("V2").Value, 
     V3 = tipo.Element("V3").Value, 
     V4 = tipo.Element("V4").Value 
    }; 

Это, конечно, работает в тестовом приложении.

+0

Вы правы .. – ozsenegal