nombre - C#Obtener valor de nodo XML
obtener valor de un nodo xml c# (3)
Podrías usar esto
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;
}
Si necesita obtener las preguntas y respuestas fuera de este alcance, le sugiero que cree una clase que contenga los datos. Por ejemplo,
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
});
Puede mejorar lo anterior utilizando un diccionario para almacenar el par de preguntas / respuestas, pero es solo un ejemplo para darle una idea. en caso de que su clase QuestionAnswer sea más complicada que solo esas dos propiedades.
Quiero obtener los valores de question
y answer
usando C #, pero antes de eso quiero obtener la identificación que necesito. Estoy usando este 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 # code:
XDocument tasks;
int TheIdINeed = 2;
string quest = "";
string answ = "";
En la carga de formulario:
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 = ...)
Lo siento, mi inglés no es bueno.
puede obtener todos los datos en el diccionario para que no repita la conversión a la cadena
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"]
pero si hay tareas sin preguntas o respuestas en su xml, tiene que verificar si res contiene la clave antes de que obtenga valor, o use TryGetValue:
string question;
res.TryGetValue("question", out question);
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"));