Добавление существующего XML-файла - PullRequest
3 голосов
/ 15 апреля 2010

У меня есть существующий XML-файл, который я хотел бы добавить без изменения формата.Существующий файл выглядит следующим образом:

<Clients>
  <User username="farstucker">
    <UserID>1</UserID>
    <DOB />
    <FirstName>Steve</FirstName>
    <LastName>Lawrence</LastName>
    <Location>NYC</Location>
  </User>
</Clients>

Как добавить другого пользователя в этом формате?Мой существующий код:

        string fileLocation = "clients.xml";

        XmlTextWriter writer;

        if (!File.Exists(fileLocation))
        {
            writer = new XmlTextWriter(fileLocation, null);
            writer.WriteStartDocument();

            // Write the Root Element
            writer.WriteStartElement("Clients");

            // End Element and Close
            writer.WriteEndElement();
            writer.Close();
        }
// Append new data here

Я думал об использовании XmlDocument Fragment для добавления данных, но я не уверен, смогу ли я сохранить существующий формат (и пустые теги), не испортив файл.

Любой совет, который вы могли бы дать, высоко ценится.

РЕДАКТИРОВАТЬ Я изменил код для чтения исходного XML, но файл продолжает перезаписываться.

Ответы [ 3 ]

4 голосов
/ 15 апреля 2010

Вы должны использовать класс XmlDocument, чтобы загрузить весь файл, изменить его в памяти, а затем записать содержимое обратно, заменив исходный файл. Не волнуйтесь, это не испортит вашу разметку, и вы даже можете попросить сохранить незначительный пробел в исходном документе, используя свойство PreserveWhitespace (http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.preservewhitespace.aspx).

1 голос
/ 16 апреля 2010

Вы можете попробовать что-то вроде этого ...

        string fileLocation = "clients.xml";

        if (!File.Exists(fileLocation))
        {
            XmlTextWriter writer = new XmlTextWriter( fileLocation, null );
            writer.WriteStartElement( "Clients" );
            writer.WriteEndElement();
            writer.Close();
        }

        // Load existing clients and add new 
        XElement xml = XElement.Load(fileLocation);
            xml.Add(new XElement("User",
            new XAttribute("username", loginName),
            new XElement("DOB", dob),
            new XElement("FirstName", firstName),
            new XElement("LastName", lastName),
            new XElement("Location", location)));
        xml.Save(fileLocation);

Это должно помочь вам начать, просто замените переменные тем, что вы используете, и не забудьте добавить пространство имен System.Xml.Linq.

Если у вас все еще есть проблемы, напишите сюда и хорошо помогите вам пройти через это.

0 голосов
/ 09 сентября 2013

Если вы хотите использовать сериализацию (то есть у вас есть объект данных, который нужно сериализовать в XML и добавить к существующему XML-файлу), вы можете использовать этот универсальный метод SerializeAppend<T>. Это именно то, что вам нужно. Я также добавил еще два метода для тех, кто может извлечь выгоду

public static void Serialize<T>(T obj, string path)
{
    var writer = new XmlSerializer(typeof(T));

    using (var file = new StreamWriter(path))
    {
        writer.Serialize(file, obj);
    }
}


public static T Deserialize<T>(string path)
{
    var reader = new XmlSerializer(typeof(T));
    using (var stream = new StreamReader(path))
    {
        return (T)reader.Deserialize(stream);
    }

}

public static void SerializeAppend<T>(T obj, string path)
{
    var writer = new XmlSerializer(typeof(T));

    FileStream file = File.Open(path, FileMode.Append, FileAccess.Write);

    writer.Serialize(file, obj);

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