Как исправить «ошибку CS0165: использование неназначенной локальной переменной» в случае переключателя XmlReader - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь прочитать данные из файла XML.Мой план состоит в том, чтобы сохранить всех студентов как объект Студента с именем и семестром.

<persons>
    <student><name>255211</name><semester>MI</semester></student>
    <student><name>255212</name><semester>MI</semester></student>
    <student><name>255213</name><semester>MI</semester></student>
</persons>

Я нашел руководство по XmlReader и переключателю, поэтому попробовал.

private static void readData()
        {
            XmlTextReader reader = new XmlTextReader("data.xml");

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.Name)
                    {
                        case "student":
                            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;
                    }
                }
            }
            reader.Close();
        } 

Моя проблема сейчас в том, что Visual Studio Code выдает ошибку: ошибка CS0165: Использованиененазначенная локальная переменная 'student' (student.name в случае "name").Я предполагаю, что это потому, что не было бы имя student.name, если код не входит в случай "student".Я пытался с попыткой поймать, но это не помогло мне.

Как я могу добиться того, чтобы каждый студент получил правильное имя и семестр?

1 Ответ

0 голосов
/ 05 февраля 2019

Вы только назначаете 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;
...