Запись XML в файл без перезаписи предыдущих данных - PullRequest
4 голосов
/ 27 июня 2011

В настоящее время у меня есть программа на C #, которая записывает данные в файл XML при использовании .NET Framework.

if (textBox1.Text!="" && textBox2.Text != "")
{
    XmlTextWriter Writer = new XmlTextWriter(textXMLFile.Text, null);
    Writer.WriteStartDocument();
    Writer.WriteStartElement("contact");
    Writer.WriteStartElement("firstName");
    Writer.WriteString(textBox1.Text);
    Writer.WriteEndElement();

    Writer.WriteEndElement();
    Writer.WriteEndDocument();
    Writer.Close();
}
else
{
    MessageBox.Show("Nope, fill that textfield!");
}

Проблема в том, что мой XML-файл перезаписывается каждый раз, когда я пытаюсь сохранить что-то новое.

У меня были оба параметра null и Encoding.UTF8 для второго параметра в XmlTextWriter, но, похоже, это не то, что изменяет функцию не перезаписи / перезаписи.

Ответы [ 4 ]

6 голосов
/ 27 июня 2011

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

public static void Append(string filename, string firstName)
{
    var contact = new XElement("contact", new XElement("firstName", firstName));
    var doc = new XDocument();

    if (File.Exists(filename))
    {
        doc = XDocument.Load(filename);
        doc.Element("contacts").Add(contact);
    }
    else
    {
        doc = new XDocument(new XElement("contacts", contact));
    }
    doc.Save(filename);
}

и затем используйте так:

if (textBox1.Text != "" && textBox2.Text != "")
{
    Append(textXMLFile.Text, textBox1.Text);
}
else
{
    MessageBox.Show("Nope, fill that textfield!");
}

Это создаст / добавит контакт к следующей структуре XML:

<?xml version="1.0" encoding="utf-8"?>
<contacts>
  <contact>
    <firstName>Foo</firstName>
  </contact>
  <contact>
    <firstName>Bar</firstName>
  </contact>
</contacts>
5 голосов
/ 27 июня 2011

Единственный способ добавить данные в файл XML - это прочитать его, добавить данные, а затем снова записать полный файл.

Если вы не хотите читать весь файл впамяти, вы можете использовать потоковые интерфейсы (например, XmlReader / XmlWriter) для чередования ваших операций чтения, добавления и записи.

1 голос
/ 27 июня 2011

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

void Main()
{
    var contacts = new List<Contact> 
    { 
        {new Contact { FirstName = "Bob", LastName = "Dole" }},
        {new Contact { FirstName = "Bill", LastName = "Clinton" }}
    };

    XmlSerializer serializer = new XmlSerializer(typeof(List<Contact>));
    TextWriter textWriter = new StreamWriter(@"contacts.xml");
    serializer.Serialize(textWriter, contacts);
    textWriter.Close(); 
}

public class Contact
{
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
}
1 голос
/ 27 июня 2011

Просто чтобы добавить к ответу Дарина, вот статья, которую я собирался включить в свой собственный ответ в качестве хорошего справочника о том, как использовать XDocument для добавления узлов в существующий документ XML:

http://davidfritz.wordpress.com/2009/07/10/adding-xml-element-to-existing-xml-document-in-c/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...