Вы только назначаете student
в случае "student"
;с точки зрения компилятора, student
не назначается в начале случаев "name"
и "semester"
, поэтому вы не можете устанавливать для них свойства.Возможно, вы знаете, что <student>
всегда на первом месте, но компилятор этого не знает.Кроме того, с ее точки зрения, область видимости является отдельной для каждого элемента.Но если вы на 100% уверены , что между каждым всегда есть <student>
, то вы, вероятно, можете немного переместить задание:
Student student = null;
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
switch (reader.Name)
{
case "student":
student = new Student();
Students.Add(student);
break;
case "name":
student.name = reader.ReadString();
//Console.WriteLine(student.name);
break;
case "semester":
student.semester = reader.ReadString();
break;
}
}
}
Однако в действительности в большинствеСценарии, я настоятельно рекомендую использовать XmlSerializer
или аналогичный для анализа ввода в объекты, а затем просто работать с ними как с объектами.
На основе макета XML в вопросе это должно работать:
public class Student {
[XmlElement("name")]
public string Name {get;set;}
[XmlElement("semester")]
public string Semester {get;set;}
}
[XmlRoot("persons")]
public class SomeData {
[XmlElement("student")]
public List<Student> Students {get;} = new List<Student>();
}
и:
var ser = new XmlSerializer(typeof(SomeData));
var data = (SomeData)ser.Deserialize(source);
List<Student> students = data.Students;