Недопустимый XML при использовании XmlWriter в C#

Я пытаюсь создать следующий XML-документ:

FileStream fs = new FileStream(path, FileMode.Create);

            XmlWriter w = XmlWriter.Create(fs);

            w.WriteStartDocument();
            w.WriteStartElement("People");
            w.WriteStartElement("Person");
            // loop over checked elements
            foreach (var xxx in checkedListBox1.Items)
            {

                w.WriteAttributeString("Name", textBox1.Text);
                w.WriteAttributeString("GamerTag", textBox2.Text);
                w.WriteAttributeString("Wins", textBox3.Text);
                w.WriteAttributeString("Losses", textBox4.Text);
                w.WriteAttributeString("Ratio", textBox5.Text);

                // get id of this match
                id = checkedListBox1.Text.Substring(1, 3);
                // call the function at the service to download the type of struct we require
                res = client.photo(id);
                format = System.Drawing.Imaging.ImageFormat.Jpeg;
                w.WriteElementString("Picture-id", res.ToString());
                if (checkedListBox1.GetItemChecked(checkedListBox1.SelectedIndex))
                {
                    // do something
                    w.WriteElementString("Game", checkedListBox1.Text);
                }
                w.WriteEndElement();
            }
            w.WriteEndElement();
            w.WriteEndDocument();
            w.Flush();
            fs.Close();

Однако при отладке я получаю эту ошибку -

Токен StartAttribute в состоянии Element Content приведет к созданию недопустимого XML-документа.

На линии - w.WriteAttributeString("Name", textBox1.Text);

Я проверил наличие пробелов и т. д., однако не уверен, почему это происходит, любая помощь приветствуется.


person Ebikeneser    schedule 28.11.2011    source источник
comment
Используйте using на своем FileStream, чтобы обеспечить расположение.   -  person Jesse C. Slicer    schedule 28.11.2011


Ответы (3)


Вызов w.WriteStartElement("Person"); должен быть частью цикла.

В конце концов, вы также вызываете w.WriteEndElement() в цикле.

person Tomalak    schedule 28.11.2011
comment
@leppie: Да, комментарий уже был ответом, поэтому я переместил его. ;) - person Tomalak; 28.11.2011
comment
Кажется, клоун выше скопировал ваш комментарий. IIRC текст был идентичен. Делает меня грустной пандой. - person leppie; 28.11.2011
comment
@leppie: Нет, текст не идентичен на 100%. Кроме того, ошибка действительно настолько очевидна, что не нужно копировать/вставлять, чтобы прийти к такому же выводу. ;) - person Tomalak; 28.11.2011

Как указал Томалак, w.WriteStartElement("Person"); должен быть частью цикла. Кроме того, нельзя nice создавать XML "на лету" внутри вашего графического интерфейса. Вам следует подумать о создании отдельных классов, которые содержат вашу структуру данных.

class Person 
{
    public string Name { get; set; }

    public string GamerTag { get; set; }

    // all other attributes go here
}

class People 
{
    public Person[] Persons { get; setM }
}

заполните эти классы либо вручную, либо связав их с элементами управления и сгенерируйте свой XML из этих классов. А также рассмотрите возможность изменения имен ваших элементов управления. Всегда приятно знать, что представляет элемент управления, не находя его сначала в форме. textBox1 не имеет особого смысла, NameTextBox - лучший выбор, не так ли?

person esskar    schedule 28.11.2011
comment
Я понимаю вашу точку зрения @esskar, я не совсем уверен, я думаю, что XML может быть плохо структурирован из-за того, как я его написал. Спасибо за отзыв. - person Ebikeneser; 28.11.2011

Я думаю, что строка w.WriteStartElement("Person"); должна быть записана в цикле. Вы не запускаете элемент в цикле, а заканчиваете его.

person Fischermaen    schedule 28.11.2011