2013-08-11 2 views
2

Я хочу получить значения question и answer с использованием C#, но перед этим хочу получить идентификатор, который мне нужен. Я использую этот XML:C# Получить значение XML-узла

<root> 
    <information> 
    <name>Tasks</name> 
    <date>15-05-2005</date> 
    </information> 
    <tasks> 
     <task> 
     <id>1</id> 
     <question>Here comes question 1</question> 
     <answer>Answer 1</answer> 
     </task> 
     <task> 
     <id>2</id> 
     <question>Here comes question 2</question> 
     <answer>Answer 2</answer> 
     </task> 
     <task> 
     <id>3</id> 
     <question>Here comes question 3</question> 
     <answer>Answer 3</answer> 
     </task> 
</root> 

C# код:

XDocument tasks; 
int TheIdINeed = 2; 
string quest = ""; 
string answ = ""; 

В виде нагрузки:

tasks = XDocument.Load(leveltoload); 
var status = tasks.Element("level").Element("information"); 
quest = tasks.Element("root").Element("tasks").Element("task").Element("question").Value; // It returns me the first task data, but I need to load data with required Id (int TheIdINeed = ...) 

Я сожалею, что мой английский не очень хорошо.

+0

Идеальный английский – Savage

ответ

3

Вы можете использовать этот

string id = "2"; 
var qa = doc.Descendants("tasks").Elements("task") 
         .Where(x => x.Element("id").Value == id).FirstOrDefault(); 
if (qa != null) 
{ 
    var question = qa.Element("question").Value; 
    var answer = qa.Element("answer").Value; 
} 

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

public class QuestionAnswer 
{ 
    public string ID { get; set; } 
    public string Question { get; set; } 
    public string Answer { get; set; } 
} 


var qa = doc.Descendants("tasks").Elements("task") 
      .Where(x => x.Element("id").Value == id) 
      .Select(x => new QuestionAnswer() 
        { 
         ID = "2", 
         Question = x.Element("question").Value, 
         Answer = x.Element("answer").Value 
        }); 

Вы могли бы улучшить выше, используя словарь для хранения Вопрос/ответ пару, но это всего лишь пример, чтобы дать вам идею. в случае, если ваш класс QuestionAnswer более сложный, чем только эти два свойства.

+0

всегда бил меня купить минуту .... –

+1

Это немного неэффективно, так как вы могли бы использовать Фирс tOrDefualt перегрузка, которая принимает предикат. –

+0

Да, это работает! Спасибо! – mirelana

2
var empty = new XElement("e"); 
var sID = id.ToString(); 
var element = tasks.Descendants("task") 
        .FirstOrDefault(x => ((string)x.Element("id")) == sID); 
string quest = (string)((element ?? empty).Element("question")); 
string answ = (string)((element ?? empty).Element("answer")); 
+1

Нет такой вещи, как 'XElement.Empty' (если вы не имеете в виду' IsEmpty', но это не статическое свойство). – keyboardP

+1

@keyboardP Исправлено. –

1

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

var res = tasks.Descendants("task") 
    .Select(x => x.Elements().ToDictionary(e => e.Name.ToString(), e => (string)e.Value)) 
    .FirstOrDefault(x => x["id"] == id); 

res["question"] 
res["answer"] 

но если есть задачи без вопросов или ответов в вашем XML вы должны проверить, если УЭ содержит ключ прежде чем вы получите значение, или использовать TryGetValue:

string question; 
res.TryGetValue("question", out question); 
Смежные вопросы